如果我有两个相互关联的模型:
class Person(models.Model)
name = models.CharField()
class Project(models.Model):
person = models.ForeignKey(Person)
title = models.CharField()
我经常发现自己试图找到与每个人相关的项目数量:
person = Person.objects.get(id=1)
no_projects = Project.objects.filter(person=person).count()
有没有办法将此作为自定义字段添加到Person模型中,以便我可以调用person.no_projects
?
答案 0 :(得分:4)
这可以通过向Person类添加属性来完成。
class Person(models.Model)
name = models.CharField()
@property
def no_projects(self):
return Project.objects.filter(person=self).count()
现在可以像这样调用
person = Person.objects.get(id=1)
person.no_projects
答案 1 :(得分:4)
事实上,该功能(几乎)是内置的。您可以person.project_set.count()
来获取该项目的计数(而.all()
获取实际列表),而不是查询项目。
答案 2 :(得分:1)
您可以使用property()生成动态字段。
class Project(models.Model):
person = models.ForeignKey(Person)
title = models.CharField()
def _get_no_projects(self):
return Projects.objects.filter(person=self).count()
no_projects = property(_get_no_projects)
class Project(models.Model):
person = models.ForeignKey(Person)
title = models.CharField()
def _get_no_projects(self):
return Projects.objects.filter(person=self).count()
no_projects = property(_get_no_projects)
但动态字段不能用于查询,因为它们并不真正将数据存储到数据库中。
仅供参考:http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/