如何在 django 中只获得多对多关系的结果

Posted

技术标签:

【中文标题】如何在 django 中只获得多对多关系的结果【英文标题】:how to get only results in many to many relationship in django 【发布时间】:2018-11-09 21:54:24 【问题描述】:

我有以下关系:

class Customer(models.Model):  
    user = models.OneToOneField(User, on_delete=models.CASCADE)  

class Post(models.Model):  
    customer = models.ForeignKey('common.Customer', 
    mentions = models.ManyToManyField('common.Customer',related_name='mentions')

我想获取帖子中提到的所有用户。我在想这样的事情:

customer = Customer.objects.get(user=request.user)
posts = Post.objects.filter(mentions__in=customer).order_by('-created_at')

这是否接近我想要完成的目标?

【问题讨论】:

【参考方案1】:

试试这条线

users = User.objects.filter(mentions__isnull=False)

【讨论】:

【参考方案2】:

我在 django 的多对多文档中看到了这一点,它确实有效:

posts = Post.objects.filter(mentions__pk=customer.id)

【讨论】:

【参考方案3】:

恐怕绝对不是。

customer = Customer.objects.get(user=request.user)
posts = Post.objects.filter(mentions__in=customer).order_by('-created_at')

mentions__in = customer 会失败,因为__in lookup 需要一个可迭代对象(单个客户不是)。

除此之外,该查询将为您提供所有提及 customer 的帖子,这也可以通过两种更直接的方式实现:

posts = Post.objects.filter(mentions=customer).order_by('-created_at')

posts = customer.mentions.order_by('-created_at') # using the 'related_name' from the customer's side

您希望获取帖子中提到的所有用户。但是什么帖子?你忘了在你的问题中提到这一点。您只给了我们当前用户 (request.user),该用户可以拥有多个帖子。 我将猜测并展示如何让当前用户发布的帖子中提到的所有其他用户。 为了更清楚地说明该关系的related_name,我将其更改为related_name = 'mentionend'

posts = Post.objects.filter(mentions=customer) # all posts of the current user

# all other users mentioned in those posts
users = Customer.objects.exclude(user=customer).filter(mentionend__in=posts) # using 'related_name'
# or
users = posts.mentions.exclude(user=customer) 

【讨论】:

以上是关于如何在 django 中只获得多对多关系的结果的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中获取具有多对多关系的复杂查询集

Django:如何聚合/注释多对多关系?

Django 1.8 - 中间多对多关系 - 使用“ManytoManyField”的结果是啥?

如何在 Django 中向多对多关系中添加字段?

如何在双连接关系之后在 Django 中执行查询(或:如何绕过 Django 对多对多“通过”模型的限制?)

逻辑或 Django 多对多查询返回重复结果