Параметры захвата в django-rest-framework
предположим, что этот url:
http://localhost:8000/articles/1111/comments/
Я хочу получить все комментарии к данной статье (здесь 1111).
Вот как я захватываю этот URL:
url(r'^articles/(?P<uid>[-\w]+)/comments/$', comments_views.CommentList.as_view()),
Связанный вид выглядит так:
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
Для получения информации соответствующий сериализатор
class CommentSerializer(serializers.ModelSerializer):
owner = UserSerializer()
class Meta:
model = Comment
fields = ('id', 'content', 'owner', 'created_at')
Как вы можете видеть, я обновил свой get_queryset, чтобы фильтровать комментарии к статье, но я не знаю, как поймать параметр "uid".
С url, заканчивающимся на? Uid = value, я могу использовать self.request.QUERY_PARAMS.get('uid'), но в моем случае я не знаю, как это сделать.
Идея?
Ответы
Ответ 1
Параметр url хранится в self.kwargs
. lookup_field
- это поле (по умолчанию pk), общий вид использует внутри ORM при поиске отдельных экземпляров модели, lookup_url_kwarg
- это, вероятно, свойство, которое вы хотите.
Итак, попробуйте следующее:
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