例如,我有一个抽象模型X
,并且A
,B
和C
模型是从X
继承的(其中一些字段已重新定义) )。
我想创建一个包含所有A
,B
和C
的QuerySet。由于X
是抽象的,并且没有自己的QuerySet(因为它不是通用X
的表),因此我尝试执行以下操作:
# annotating with a `type` integer denoting the actual type
# some_field is present in A and B, but absent in C, so we add a placeholder to allow `union`
(A.objects.all().annotate(type=models.Value(1, models.IntegerField()))
.union(B.objects.all().annotate(type=models.Value(2, models.IntegerField())))
.union(C.objects.all().annotate(some_field=models.Value(None, models.IntegerField()),
type=models.Value(3, models.IntegerField()))
)
)
但是,这不起作用,因为对于联合的每个部分,由于形成的SQL查询中的列顺序不同(由于重新定义的字段)。有没有办法明确指定顺序?
P.S。这里我不能使用values()
或values_list()
,因为我必须将模型对象(而不是字典/元组)保留在QuerySet中。