web-dev-qa-db-de.com

Erfassen Sie die Parameter im Django-Rest-Framework

angenommen, diese URL:

http://localhost:8000/articles/1111/comments/

ich möchte alle Kommentare zu einem bestimmten Artikel erhalten (hier der 1111).

So erfasse ich diese URL:

url(r'^articles/(?P<uid>[-\w]+)/comments/$', comments_views.CommentList.as_view()),

Die zugehörige Ansicht sieht folgendermaßen aus:

class CommentList(generics.ListAPIView):    
    serializer_class = CommentSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    lookup_field = "uid"

    def get_queryset(self):
        comments = Comment.objects.filter(article= ???)
        return comments

Zur Information der zugehörige Serializer

class CommentSerializer(serializers.ModelSerializer):
    owner = UserSerializer()

    class Meta:
        model = Comment
        fields = ('id', 'content', 'owner', 'created_at')

Wie Sie sehen können, habe ich mein get_queryset aktualisiert, um Kommentare zum Artikel zu filtern, aber ich weiß nicht, wie ich den "uid" -Parameter abfangen soll. Mit einer URL, die mit? Uid = value endet, kann ich self.request.QUERY_PARAMS.get ('uid') verwenden, aber in meinem Fall weiß ich nicht, wie ich das machen soll. Eine Idee ?

39
billyJoe

Der URL-Parameter wird in self.kwargs Gespeichert. lookup_field Ist das Feld (standardmäßig pk), das die generische Ansicht im ORM beim Aufrufen einzelner Modellinstanzen verwendet. lookup_url_kwarg Ist wahrscheinlich die gewünschte Eigenschaft.

Versuchen Sie also Folgendes:

class CommentList(generics.ListAPIView):    
    serializer_class = CommentSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    lookup_url_kwarg = "uid"

    def get_queryset(self):
        uid = self.kwargs.get(self.lookup_url_kwarg)
        comments = Comment.objects.filter(article=uid)
        return comments
60
Scott Woodall