gpt4 book ai didi

django - 在 Django 中结合 prefetch_related 和 annotate

转载 作者:行者123 更新时间:2023-12-04 21:15:14 26 4
gpt4 key购买 nike

我有三个模型

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()
我可以得到输出
name, number of model c objects
==============
Some name, 312
Another name, 17
随着查询集
ModelA.objects.all().prefetch_related('modelb_set', 'groupb_set__modelc_set')
和模板
{% for modela in modela_list %}
{% for modelb in modela.modelb_set.all %}
{{ modelb }}, {{ modelb.modelc_set.count }}
{% endfor %}
{% endfor %}
我想对 ModelC 中的金额字段求和,而不是计算连接到每个 ModelB 对象的 ModelC 对象的数量。
不知道怎么组合 prefetch_relatedannotate在我的查询集中,但它必须是这样的
(ModelA.objects.all()
.prefetch_related('modelb_set', 'groupb_set__modelc_set')
.annotate(total_amount=Sum('modelc_set__amount')))

最佳答案

我认为您应该能够通过这样做来实现这一目标:

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')))
在您的模板中,您应该使用:
{% for modela in modela_list %}
{{ modela.name }}, {{ modela.total_amount }}
{% endfor %}

关于django - 在 Django 中结合 prefetch_related 和 annotate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25386272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com