django定制模型领域

时间:2012-04-17 09:21:32

标签: django django-models

如果我有两个相互关联的模型:

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

3 个答案:

答案 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/