我有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
?
答案 0 :(得分:1)
这样的事情怎么样-根据我的理解,您想要一个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()
)