在 Django 中进行一个复杂的查询,我所有的后续帖子

Posted

技术标签:

【中文标题】在 Django 中进行一个复杂的查询,我所有的后续帖子【英文标题】:Making a complicated query in Django all my follows posts 【发布时间】:2014-12-17 06:08:23 【问题描述】:

想象一下:

我在 Django 应用中有“帖子”、“用户”、“用户关注用户”模型...

我想从我的 POST 模型中获取所有 POSTS,但仅限于我关注的人。

每个 POST 都有一个作为作者的用户的 USER id。

我的意思是,有一个寄存器说:

“Cris”跟随“Larry”

我想从拉里和我关注的其他人那里获得帖子。

我试过了:

follows = UserFollowUser.objects.get(follower = request.user) #I AM request.user
posts = Post.objects.filter(user = follows.followed).order_by('-id')

但由于对象对象中的“GET”功能,我只能从一个人那里获取帖子。

【问题讨论】:

如果这是在 SQL 中,我会写类似 SELECT p.* FROM UserFollowsUser ufu INNER JOIN Post p on (ufu.followed = p.user_id) WHERE ufu.follower = $1;这将类似于 SQLAlchemy 中的内容。是否有 objects.getall() 或类似的东西? 【参考方案1】:

您需要做的是为您的关注者获取一组用户 ID。然后使用__in syntax 进行查询,您要在其中询问其用户ID 在您的关注者的用户ID 集中的所有帖子。代码看起来像这样:

follower_user_ids = UserFollowUser.objects.filter(follower__user_id = request.user.id)\
                                          .values_list('follower__user_id', flat=True)\
                                          .distinct()
posts = Post.objects.filter(user_id__in=follower_user_ids)

*这假定 UserFollowUser.follower 是 User 表的外键。

【讨论】:

我认为你的意思是followees,因为请求者是follower。我不确定您在列表中使用了正确的值 - 看起来它只会给出 request.user.id。我认为您希望您的 .values_list() 包含“followed__user_id”,但除此之外它对我来说还不错。【参考方案2】:

如果您想显示所有登录用户的帖子,请使用此代码,用户也可以在提要中关注您自己发布的帖子:

follows_users = user.profile.follows.all()
follows_posts = Post.objects.filter(author_id__in=follows_users)
user_posts = Post.objects.filter(author=user)
post_list = (follows_posts|user_posts).distinct().order_by('-date_posted')

您可以随时参考https://github.com/uttampatel007/nccbuddy 的社交媒体 django 克隆

【讨论】:

以上是关于在 Django 中进行一个复杂的查询,我所有的后续帖子的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 1.9 中查询复杂的 JSONB 字段

Django 复杂查询

Django:使用嵌套模型从许多关系查询中进行复杂排序和过滤

如何在 django 中进行复杂的搜索?使用视图还是模型?

使用 Vue.js 和 Auth0 进行前端认证时如何在 Django 的后端数据库中创建用户

Django:使用嵌套模型进行查询的复杂排序