django 在这种情况下如何使用Q和过滤related_name?

Posted

技术标签:

【中文标题】django 在这种情况下如何使用Q和过滤related_name?【英文标题】:django How to use Q and filter related_name in this case? 【发布时间】:2020-04-01 19:40:17 【问题描述】:

我有一个类似的跟随模型:

class Follow(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='fuser') #who is following
    follow = models.ForeignKey(User, on_delete=models.CASCADE, related_name='ffollow') #who is followed

然后我想通过关注获得用户。

案例1:我想找到user_john和user_mark都关注的用户。

users = User.objects.filter(Q(this_user_is_followed_by=user_john)
                            & Q(this_user_is_followed_by=user_mark))

案例2:想查找user_john关注的用户,但是user_mark关注的用户。

users = User.objects.filter(Q(there_user_is_followed_by=user_john)
                            & Q(these_user_are_following=user_mark))

如何做那个过滤器?太难了。

users = User.objects.filter(Q(ffollow__user=user)
                            & Q(ffollow__user=user_who_read))

将是案例 1 的答案。

但我不能确定。

【问题讨论】:

【参考方案1】:

案例1:我想找到user_johnuser_mark都关注的用户。

第一种情况应该使用 两个 过滤器解决,否则您将过滤 same 相关对象:

User.objects.filter(<b>fuser__follow=user_john</b>).filter(<b>fuser__follow=user_mark</b>)

案例2:想找到user_john关注的用户,但是user_mark关注的用户。

User.objects.filter(<b>fuser__follow=user_john</b>, <b>ffollow__user=user_mark</b>)

【讨论】:

您可以在第一种情况下使用 __in 运算符 @JPG:这将返回Users 后面的user_john (一个,或两个)user_mark,而不是本身两者.

以上是关于django 在这种情况下如何使用Q和过滤related_name?的主要内容,如果未能解决你的问题,请参考以下文章

Django:为相关表构建动态 Q 查询

Django过滤查询和或

jQuery & Django:在这种情况下如何正确使用 jquery

jQuery和Django:在这种情况下如何正确使用jquery

使用 F 和 Q 表达式进行 Django 模型过滤

django过滤器中的逻辑操作