首页 > 解决方案 > 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 或Obb2

我想通过总计sizeApp对于给定Apk.size的所有 + 总和)来注释 QuerySet。Obb.sizeAppVersion

我的App查询集看起来像这样:

qs = App.objects.filter(is_visible=True)

和版本子查询是:

latest_versions = Subquery(AppVersion.objects.filter(application=OuterRef(OuterRef('pk'))).values('pk')[:1])

此子查询始终提供最新AppVersionApp.

那么我应该使用什么子查询来注释如上所示计算qs的属性?size

标签: djangodjango-annotatedjango-subquery

解决方案


像这样的东西怎么样 - 根据我的理解,你想要一个 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()
)

推荐阅读