如何使用 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'从相关(ForeignKey)django模型中接收并非所有字段
如何强制 Django Admin 使用 select_related?
django: select_related() 在一个已经存在的对象上?