如何使用 select_related 获取 ManyToMany 字段值

Posted

技术标签:

【中文标题】如何使用 select_related 获取 ManyToMany 字段值【英文标题】:How to get ManyToMany Field values in with selecte_related 【发布时间】:2021-12-29 18:09:39 【问题描述】:

我是 Django 新手。我在我的 Profile 模型中使用 ManyToMany 字段和 Membership 模型。

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    picture = models.ImageField(blank=True)
    membership = models.ManyToManyField(MemberShip, null=True)

我想做的是获得所有具有特定会员资格的用户(来自会员模式)

例如,我想要拥有 Red Membership 的所有用户的列表。我研究并发现select_related()prefetch_related 在某种程度上可以提供帮助。但我不明白如何使用这些方法来获得我想要的。

我试过了:

user_memberships_all = Profile.objects.all()
for m in user_memberships_all:
    affiliate_with_membership = m.membership.select_related('user').all()

但我收到一条错误消息Invalid field name(s) given in select_related: 'user'. 如果有另一个实现这一目标。你能帮忙吗?谢谢。

【问题讨论】:

您想在哪里列出这些用户? 在视图中。我正在用我迄今为止尝试过的内容更新问题。 @IainShelvington 你现在可以看一下吗。 为什么不使用多对一关系?如果你所有的获取都是会员等级? 【参考方案1】:

要获取与特定 MemberShip 相关的所有用户,您可以向后跟踪 OneToOneField,然后在 ManyToManyField 上进行过滤

# Filtering on a "name" attribute of MemberShip

User.objects.filter(profile__membership__name='red')

# Using a MemberShip instance

red_membership = MemberShip.objects.get(name='red')
User.objects.filter(profile__membership=red_membership)

【讨论】:

以上是关于如何使用 select_related 获取 ManyToMany 字段值的主要内容,如果未能解决你的问题,请参考以下文章

使用 select_related 从两个模型中获取值

如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段

如何强制 Django Admin 使用 select_related?

django: select_related() 在一个已经存在的对象上?

如何使用 google-appengine 和 django-nonrel 模仿“select_related”?

如何在模板 Django 中使用 select_related?