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


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

尝试:

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

在这里,您将找到 M2M 关系的相关文档

相关内容

最新更新