Jam*_*een 11 django django-templates django-models django-queryset django-views
我有三个型号
class ModelA(models.Model):
name = CharField(max_length=100)
class ModelB(models.Model):
modela = ForeignKey(ModelA)
class ModelC(models.Model):
modelb = ForeignKey(ModelB)
amount = IntegerField()
Run Code Online (Sandbox Code Playgroud)
我可以得到输出
name, number of model c objects
==============
Some name, 312
Another name, 17
Run Code Online (Sandbox Code Playgroud)
使用queryset
ModelA.objects.all().prefetch_related('modelb_set', 'groupb_set__modelc_set')
Run Code Online (Sandbox Code Playgroud)
和模板
{% for modela in modela_list %}
{% for modelb in modela.modelb_set.all %}
{{ modelb }}, {{ modelb.modelc_set.count }}
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我没有计算连接到每个ModelB对象的ModelC对象的数量,而是想要对ModelC中的amount字段求和.
我不知道如何结合prefetch_related
并annotate
在我的查询集,但它必须是这样的
(ModelA.objects.all()
.prefetch_related('modelb_set', 'groupb_set__modelc_set')
.annotate(total_amount=Sum('modelc_set__amount')))
Run Code Online (Sandbox Code Playgroud)
我认为您应该能够通过这样做来实现这一目标:
from django.db.models import F, Sum
(ModelA.objects.all()
.prefetch_related('modelb_set', 'modelb__modelc_set')\
.values('name')\ # group values by modela.name, read: https://docs.djangoproject.com/en/1.9/topics/db/aggregation/
.annotate(name = F('name'),
total_amount = Sum('modelb__modelc__amount')))
Run Code Online (Sandbox Code Playgroud)
在您的模板中,您应该使用:
{% for modela in modela_list %}
{{ modela.name }}, {{ modela.total_amount }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9838 次 |
最近记录: |