Django检查ManyToMany字段中的对象

Posted

技术标签:

【中文标题】Django检查ManyToMany字段中的对象【英文标题】:Django check if object in ManyToMany field 【发布时间】:2013-05-19 07:49:30 【问题描述】:

我有一个很简单的问题要解决。我有与其关联的 >= 0 个用户的合作伙伴模型:

class Partner(models.Model):
    name = models.CharField(db_index=True, max_length=255)
    slug = models.SlugField(db_index=True)
    user = models.ManyToManyField(User)

现在,如果我有一个用户对象和一个合作伙伴对象,那么检查用户是否与合作伙伴关联的最 Pythonic 方式是什么?如果UserPartner 相关联,我基本上想要一个返回True 的语句。

我试过了:

users = Partner.objects.values_list('user', flat=True).filter(slug=requested_slug)
if request.user.pk in users:
    # do some private stuff

这可行,但我觉得有更好的方法。此外,考虑到我需要一个命名参数 (slug) 和一个请求对象 (user),这是否容易滚入装饰器。

【问题讨论】:

【参考方案1】:
if user.partner_set.filter(slug=requested_slug).exists():
     # do some private stuff

【讨论】:

太棒了。我知道有一些不那么冗长的方式。谢谢。 如何在else中提升http403?返回 HttpResponseForbidden 抛出错误 我猜,因为我看不到您的完整上下文,但看起来您正在尝试返回课程。相反,您必须实例化它:return HttpResponseForbidden(). 这里特定合作伙伴的过滤在哪里? @Alex78191 - 它是自动创建的反向关系访问器。因为PartnerUser 有关系,所以User 实例具有访问器属性partner_set。有关详细信息,请参阅文档:docs.djangoproject.com/en/2.2/topics/db/queries/…【参考方案2】:

如果我们只需要知道user 对象是否与partner 对象相关联,我们可以执行以下操作(如this answer):

if user in partner.user.all():
    #do something

【讨论】:

以上是关于Django检查ManyToMany字段中的对象的主要内容,如果未能解决你的问题,请参考以下文章

Django:模型设计,ManyToMany 属性字段?

Django / Python - 在对象创建中使用ManyToMany字段

Django - 按添加到 ManyToMany 字段的最后一个元素查询对象

如何在django中查询具有manytomany字段指向它们的对象

Django 中的 OneToOne、ManyToMany 和 ForeignKey 字段有啥区别?

Django 1.4 - ManyToMany 字段看起来像用户身份验证中的用户权限字段