【问题标题】:Django check if object in ManyToMany fieldDjango检查ManyToMany字段中的对象
【发布时间】: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),这是否容易滚入装饰器。

【问题讨论】:

    标签: django django-models django-views


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2012-06-22
      • 2021-09-16
      • 1970-01-01
      • 2012-04-19
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多