【问题标题】:`lookup_field` doesn't work on `ListAPIView``lookup_field` 不适用于`ListAPIView`
【发布时间】:2018-06-25 20:13:14
【问题描述】:

我正在创建一个 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'

我对名为“reddit-posts”的网址有疑问。此 url 尝试获取所有特定的 subreddit,其 id 在 url 中指定为 r_id。这里的问题是我得到了所有的帖子,而不是那个 subreddit 的帖子。因此,如果我在 id=1 的 subreddit 中有 2 个帖子和 id=2 的 subreddit 有 3 个帖子,如果我转到 r/1/posts/,理论上我应该只收到 2 个帖子,但实际上我会收到所有 5 个帖子。 我已经指定了lookup_fieldlookup_url_kwarg,但这似乎不起作用。需要帮忙!谢谢!

【问题讨论】:

  • 你没有过滤queryset = Post.objects.all(),你得到了所有的对象

标签: django django-rest-framework lookup-field


【解决方案1】:

显然,docs 表示您需要自己为ListAPIView 编写过滤器。 另见this similar question

在你的情况下,看起来像这样:

class ListPostsOfReddit(ListAPIView):
    serializer_class = PostSerializer

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

据我了解docs for the generic API viewslookup_fieldlookup_url_kwarg 属性仅用于详细视图,而不是列表视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多