django-table2和django注释问题

时间:2016-09-12 13:02:57

标签: django-tables2 annotate

我在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个问题:

  1. b_namec_name是ID,而不是预期的名称。

  2. a_name为空,我认为因为第一个问题,bmodel没有正确返回查询集中的bmodel,那么bmodel.a_name无法正常工作。

  3. 我可以找到显示解决方案" id"在DModel中只有一个ForeignKey的问题,如提到here,但不知道如何处理mutlti-foreign key case。

    有人可以帮忙吗?非常感谢

2 个答案:

答案 0 :(得分:0)

  1. 您可能需要在返回__str__的模型上定义__unicode__ / self.x_name方法。

  2. DModel上的外键名称为b_name,因此您应使用a_name = tables.Column(accessor='b_name.b_name')

答案 1 :(得分:0)

所有,稍后我找出问题:

{{1}}

如果您想要显示名称,那么应该参考该模型的确切字段名称。并且所有需要的aggragation列必须添加到.values()。