Django通过具有多个关系的两个值的总和进行注释

时间:2019-09-30 17:11:33

标签: django django-annotate django-subquery

我有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版本始终有一个Apk,但可能有0、1或2个Obb

我想用size的总数App来注释QuerySet(这是Apk.size +给定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

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样-根据我的理解,您想要一个Apps apk,以及obb大小的总和。如果您添加了apkobb_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()
)