我在django_tables2中有一个用django.db.models
Sum
的用例,但在阅读带聚合的django doc后无法弄清楚用法,我想知道这是否可能:
# models.py
class AModel(models.Model):
a_id = models.IntegerField()
a_name = models.CharField(max_length=50)
def __unicode__(self):
return unicode(self.name)
class BModel(models.Model):
b_id = models.IntegerField()
b_name = models.CharField(max_length=50)
a_name = models.ForeignKey(AModel)
def __unicode__(self):
return self.b_name
class CModel(models.Model):
c_id = models.IntegerField()
c_name = models.CharField(max_length=50)
c_status = models.CharField(max_length=8)
def __unicode__(self):
return self.c_name
class DModel(models.Model):
d_id = models.IntegerField()
dmode = models.CharField(max_length=50)
bmodel = models.ForeignKey(BModel)
cmodel = models.ForeignKey(CModel)
date = models.DateField(null=True)
cost = models.FloatField(default=0.00)
def __unicode__(self):
return self.d_name
# tables.py
import django_tables2 as tables
class DmodelTable(tables.Table)
class Meta:
model = DModel
fields = ('dmodel', 'bmodel', 'cmodel', 'cost')
class TargetTable(tables.Table)
a_name = tables.Column(accessor='b_name.a_name')
class Meta:
model = DModel
fields = ('bmodel', 'cmodel', 'amodel', 'cost_sum')
# view.py
from django.db.models import Sum
...
def page(request):
queryset = DModel.objects.values('bmodel','cmodel').annotate(cost_sum=Sum('cost'))
table = TargetTable(queryset)
return render(request, 'tartget.html', {'table':table})
def dmodelpage(request):
table = DModelTable(DModel.objects.all())
return render(request, 'tartget.html', {'table':table})
我得到的结果如下:TargetTable:
+---------+------------+----------+--------------------+
| b_name | c_name | a_name | cost_sum |
+---------+------------+----------+--------------------+
| 1863703 | 8485748 | - | 3150 |
| 1863703 | 8688288 | - | 0 |
| 1863703 | 8691184 | - | 712.5 |
我遇到了解决方案的2个问题:
b_name
和c_name
是ID,而不是预期的名称。
a_name
为空,我认为因为第一个问题,bmodel没有正确返回查询集中的bmodel,那么bmodel.a_name
无法正常工作。
我可以找到显示解决方案" id"在DModel中只有一个ForeignKey的问题,如提到here,但不知道如何处理mutlti-foreign key case。
有人可以帮忙吗?非常感谢
答案 0 :(得分:0)
您可能需要在返回__str__
的模型上定义__unicode__
/ self.x_name
方法。
DModel
上的外键名称为b_name
,因此您应使用a_name = tables.Column(accessor='b_name.b_name')
答案 1 :(得分:0)
所有,稍后我找出问题:
{{1}}
如果您想要显示名称,那么应该参考该模型的确切字段名称。并且所有需要的aggragation列必须添加到.values()。