Django 如何检查一个对象是否在 ManyToMany 字段中?

79

我有一个很简单的问题要解决。我有一个合作伙伴模型,它至少与0个用户相关联:

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

现在,如果我有一个User对象和一个Partner对象,最Pythonic的检查User是否与Partner相关联的方法是什么?我基本上想要一条语句,如果User与Partner相关联,则返回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),那么将其转换为一个装饰器会容易一些吗?

2个回答

109
if user.partner_set.filter(slug=requested_slug).exists():
     # do some private stuff

太棒了。我知道有一些更简洁的方法。谢谢你。 - Darwin Tech
如何在else中引发http403?返回HttpResponseForbidden会抛出错误。 - pythad
我猜测,由于我无法看到您的完整上下文,但看起来您正在尝试返回类。相反,您必须实例化它:return HttpResponseForbidden() - Peter DeGlopper
这里有特定合作伙伴的筛选吗? - Alex78191
1
@Alex78191 - 这是自动生成的反向关系访问器。因为PartnerUser有关系,所以User实例具有一个访问器属性partner_set。有关详细信息,请参阅文档:https://docs.djangoproject.com/en/2.2/topics/db/queries/#related-objects - Peter DeGlopper
显示剩余4条评论

7
如果我们只需要知道一个 user 对象是否与一个 partner 对象相关联,我们可以像这个答案中所示,执行以下操作:
if user in partner.user.all():
    #do something

这个比彼得的答案快还是慢? - kevlar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接