django .filter(或任何其他管理器函数)检查ManyToMany字段中是否存在项目

时间:2015-11-18 23:28:59

标签: python django

class Barrack(models.Model):
    """
    ... many other fields ...
    """

    def how_many_helmets_for_this_user(self, user):
        helmets = self.helmet_set.filter(possessors__contains=user) # how do we do this?
        return helmets.count()

class Helmet(models.Model):
    barrack = models.ForeignKey(Barrack)
    possessors = models.ManyToManyField(User)

上面的代码不起作用。 __contains过滤器仅适用于字符串。但是,我想过滤userhelmet.possessors所在的所有头盔。

我想知道是否可以这样做只使用Django的管理员功能

我已经有一个糟糕且极其低效的解决方案,它不使用Django的经理:

def how_many_helmets(self, user):
    result = 0
    helmets = self.helmet_set.all()
    for helmet in helmets:
        if helmet.is_user_in_possessors(user):
            result += 1
    return result

# in Helmet class
def is_user_in_possessors(self, user):
    for possessor in self.possessors.all():
        if possessor == user:
            return True
    return False

1 个答案:

答案 0 :(得分:1)

尝试:

helmets = self.helmet_set.filter(possessors=user)

Here您将找到有关M2M关系的相关文档