2017-08-28 5 views
1

Ich versuche, mit Django Rest Framework Reihen für eine bestimmte Tabelle zu erstellen. Ich sehe in der documentation, dass DRF es unterstützt.Massenerstellung mit ListSerializer von Django Rest Framework

views.py

class UserProfileFeedViewSet(viewsets.ModelViewSet): 
    """Handles creating, reading and updating profile feed items.""" 

    authentication_classes = (TokenAuthentication,) 
    queryset = models.ProfileFeedItem.objects.all() 
    serializer_class = serializers.ProfileFeedItemSerializer(queryset, many=True) 
    permission_classes = (permissions.PostOwnStatus, IsAuthenticated) 

    def perform_create(self, serializer): 
     """Sets the user profile to the logged in user.""" 

     serializer.save(user_profile=self.request.user) 

serializers.py

class ProfileFeedItemListSerializer(serializers.ListSerializer): 
    def create(self,validated_data): 
     feed_list = [ProfileFeedItem(**item) for item in validated_data] 
     return ProfileFeedItem.objects.bulk_create(feed_list) 

class ProfileFeedItemSerializer(serializers.ModelSerializer): 
    """A serializer for profile feed items.""" 

    class Meta: 
     model = models.ProfileFeedItem 
     list_serializer_class = ProfileFeedItemListSerializer 
     fields = ('id', 'user_profile', 'status_text', 'created_on') 
     extra_kwargs = {'user_profile': {'read_only': True}} 

Wenn i Admin-Form versuchen Posting mit i diesen Fehler immer erhalten. Kannst du mir bitte helfen, herauszufinden, was ich hier falsch mache?

TypeError at /api/feed/ 'ProfileFeedItemListSerializer' object is not callable Request Method: GET Request URL: http://127.0.0.1:8080/api/feed/ Django Version: 1.11 Exception Type: TypeError Exception Value: 'ProfileFeedItemListSerializer' object is not callable Exception Location: /home/ubuntu/.virtualenvs/profiles_api/local/lib/python3.5/site-packages/rest_framework/generics.py in get_serializer, line 111 Python Executable: /home/ubuntu/.virtualenvs/profiles_api/bin/python Python Version: 3.5.2

Antwort

0

versuchen es:

def create(self, request, *args, **kwargs): 
    many = isinstance(request.data, list) 
    serializer = self.get_serializer(data=request.data, many=many) 
    serializer.is_valid(raise_exception=True) 
    self.perform_create(serializer) 
    headers = self.get_success_headers(serializer.data) 
    return Response(serializer.data, headers=headers) 

def perform_create(self, serializer): 
    if type(serializer.validated_data) == list: 
     for item in serializer.validated_data: 
       item.update({'user_profile': self.request.user}) 
    else: 
     serializer.validated_data.update({'user_profile': self.request.user}) 
    serializer.save() 

leider jetzt kann ich die Lösung nicht überprüfen, aber vielleicht wird es richtig geben

+0

Ich bin in der Lage, einzelne Wörterbuchdatensätze mit dieser Post-Liste von Wörterbüchern weiterhin zu werfen ** AttributError: 'Liste' Objekt hat kein Attribut 'Get' ** – Prasanna

+0

Ich fand den Tippfehler in der Antwort, versuchen Sie es –

+0

wenn Ich übergebe eine Liste von Datensätzen, die der Code-Flow nicht einmal perform_create erreicht. Es erwartet immer, dass die Daten als ein Wörterbuch weitergegeben werden. Es muss eine Möglichkeit geben, DRF mitzuteilen, dass die eingehenden Daten eine Liste von Wörterbüchern und kein einzelnes Wörterbuch sind. – Prasanna

1

Serializer_class sollte Klasse sein, nicht Klasseninstanz. Versuchen Sie, diese diese

serializer_class = serializers.ProfileFeedItemSerializer(queryset, many=True) 

zu ändern:

serializers.ProfileFeedItemSerializer 
+0

habe ich das geändert. Iam versuchen, die folgenden Daten-Set schreiben: [{ "status_text": "Hallo" }, { "status_text": "World" } ] Nun, wenn ich das Formular abschicken Ich sehe folgende Fehler in der Konsole : AttributeError: 'list' Objekt hat kein Attribut 'get' – Prasanna

+0

@Prasanna können Sie den vollständigen Fehlertext zur Frage hinzufügen? – neverwalkaloner

+0

Pastete vollständige Spur hier ... http: //dpaste.com/2PEF17P – Prasanna

Verwandte Themen