Django:关于模型经理的新手问题

时间:2010-11-01 12:44:05

标签: django django-models

我是Django的新手,我想了解如何使用经理。我已经阅读了文档,但需要一些帮助才能付诸实践。

我的模型如下:

class Place(models.Model):
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=300)
class PlaceRef(models.Model):
    place = models.ForeignKey(Place)
    entry = models.ForeignKey(Entry)
    value = models.FloatField()
    units = models.CharField(max_length=30)

如果我有特定的Place,我是否应该使用管理器来添加与之关联的所有PlaceRefs的值? (为简单起见,假设所有单位都相同......)

place = Place.objects.get(id=id)
value = PlaceRef.objects... # what to do here?

2 个答案:

答案 0 :(得分:1)

这里不需要新经理。已经有一个自动管理器处理Place和PlaceRef之间的关系 - 它可以通过place.placeref_set访问。

但要添加值,您需要使用aggregation - 特别是aggregate方法。

from django.db.models import Sum
value = place.placeref_set.aggregate(Sum('value'))

现在value是一个字典,其中包含一个值,其中包含相关PlaceRef中所有值的总和。

答案 1 :(得分:1)

您也可以将其添加为地点属性

class Place(models.Model):
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=300)

    @property
    def placeref_total(self):
      do your calculation here as suggested in Daniel's answer
      value = self.placeref_set.aggregate(Sum('value'))
      return value

然后你可以在你的代码中引用它:

  myplace = Place.objects.get(id=x)
  myplace.placeref_total

如果您不使用@property装饰器,请将其称为:       myplace.placeref_total()