Django模型管理器不能通过模型​​实例

时间:2016-05-01 23:06:15

标签: django django-models

我收到此错误'经理无法通过舞​​台实例访问'。我花了几个小时试图解决它,但我不知道我做错了什么。

models.py

class StageManager(models.Manager):
    def get_queryset(self):
        return super(StageManager, self).get_queryset().filter(stage=self.id, stage__zone=self.zone).aggregate(Sum('substage_value'))


class Stage(models.Model):
    tablerow_stage = models.ForeignKey(TRStage)
    stage_value = models.PositiveSmallIntegerField(default=0)
    slug = models.SlugField(unique=True)
    zone = models.ForeignKey(Zone)

    objects = models.Manager() # The default manager
    subs_objects = StageManager()

    def __str__(self):
        return '%s.%s.%s' % (self.zone.project,
                             self.tablerow_stage.stage_num,
                             self.zone.zone_num)

模板中的代码行:

<td style="width:40px" align="center">{{ stage.subs_objects }}</td>

1 个答案:

答案 0 :(得分:2)

Django不允许你stage.objects,仅Stage.objects(仅通过类,而不是类的实例)。您的自定义查询集遵循相同的规则。但事实是,即使允许这样做,您的查询集也不起作用 - 您引用的是idzone等仅存在于模型实例中的字段,而不是管理器。

现在我并不完全确定你实际想要实现的目标,但是这里有一种方法可以放在Stage类而不是那个查询集中。

def substage_sum(self):
    return self.__class__.objects.filter(
        stage=self.id, 
        stage__zone=self.zone
    ).aggregate(
        sum=Sum('substage_value')
    ).values_list('sum', flat=True).first()

这将返回表示总和的单个值,假设这是你想要的。