在 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:使用嵌套模型从许多关系查询中进行复杂排序和过滤