`lookup_field` не работает на`ListAPIView`

Я создаю Reddit клон.

models.py

class Subreddit(models.Model):
    owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='subreddits')

class Post(models.Model):
    owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING)
    title = models.CharField(max_length=300)
    subreddit = models.ForeignKey(Subreddit, on_delete=models.CASCADE)

urls.py

urlpatterns = [
    # API Views
    # SUBREDDIT VIEWS
    path('r/', ListSubreddits.as_view(), name='reddits'),
    path('r/<int:r_id>/', DetailSubreddit.as_view(), name='reddits-detail'),
    path('r/<int:r_id>/posts/', ListPostsOfReddit.as_view(), name='reddit-posts'), 
]

ListPostsOfReddit

class ListPostsOfReddit(ListAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    lookup_field = 'subreddit__id'
    lookup_url_kwarg = 'r_id'

У меня проблема с URL-адресом "reddit-posts". Этот URL пытается получить все конкретные subreddit, чьи id указывается в URL как r_id, Проблема здесь в том, что я получаю все сообщения, а не сообщения, относящиеся к этому subreddit. Так что, если у меня есть 2 сообщения в subreddit с id=1 и 3 сообщения с subreddit с id=2, если я пойду r/1/posts/теоретически я должен получить только 2 сообщения, но практически все 5 сообщений я получаю. Я указал lookup_field а также lookup_url_kwarg но это не похоже на работу. Нужна помощь! Спасибо!

1 ответ

Решение

Видимо, в документах говорится, что вам нужно было бы написать фильтр для себя ListAPIView, Смотрите также этот похожий вопрос.

В вашем случае это будет выглядеть так:

class ListPostsOfReddit(ListAPIView):
    serializer_class = PostSerializer

    def get_queryset(self):
        return Post.objects.filter(subreddit__id=self.kwargs['r_id'])

Насколько я понимаю, документы для общих представлений API, lookup_field а также lookup_url_kwarg атрибуты используются только в подробных представлениях, а не в представлениях списка.

Другие вопросы по тегам