django - Django通过具有多个关系的两个值的总和进行注释
问题描述
我有 4 个模型:
class App(models.Model):
...
class AppVersion(models.Model):
app = models.ForeignKey(App)
version_code = models.IntegerField()
class Meta:
ordering = ('-version_code',)
...
class Apk(models.Model):
version = models.OneToOneField(AppVersion)
size = models.IntegerField()
class Obb(models.Model):
version = models.ForeignKey(AppVersion)
size = models.IntegerField()
AppVersion
版本总是有 1 Apk
,但可能有 0、1 或Obb
2
我想通过总计size
(App
对于给定Apk.size
的所有 + 总和)来注释 QuerySet。Obb.size
AppVersion
我的App
查询集看起来像这样:
qs = App.objects.filter(is_visible=True)
和版本子查询是:
latest_versions = Subquery(AppVersion.objects.filter(application=OuterRef(OuterRef('pk'))).values('pk')[:1])
此子查询始终提供最新AppVersion
的App
.
那么我应该使用什么子查询来注释如上所示计算qs
的属性?size
解决方案
像这样的东西怎么样 - 根据我的理解,你想要一个 Apps apk,并且 obb 大小相加。apk
如果您添加了一个,obb_set
则可以用字段相关名称替换。我选择的应该是 django OneToOne 和 Fk 相关名称的默认值。
from django.db.models import F, Value, Sum, IntegerField
qs = App.objects.filter(
is_visible=True
).annotate(
apk_size=Sum('apk__size'),
obb_size=Sum('obb_set__size')
).annotate(
total_size=Value(
F('apk_size') + F('obb_size'),
output_field=IntegerField()
)