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
筛选器仅适用于字符串。然而,我想过滤user
在helmet.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 关系的相关文档