我的目标是对一个模型运行查询,但根据通过prefetch_related
获取的另一个模型中的字段对结果进行排序。
假设我有两个模型:
class ModelA(models.Model):
...some fields...
class ModelB(models.Model):
...some fields...
model_a = models.ForeignKey(ModelA, db_column='id')
year = models.IntegerField()
我尝试过:
ModelA.objects.filter(...).prefetch_related(
Prefetch(
'modelb_set',
queryset=ModelB.objects.filter().order_by('-year'),
to_attr="modelb_date"
)
).order_by('-modelb_date')
但是失败了,因为modelb_date
不是ModelA
上的字段,它是一个列表。我想要的是根据最新的关联ModelA
字段(来自date
)对ModelB
查询集进行排序。也就是说,如果One
的实例ModelA
具有modelb_date
属性= [x, y, z]
,其中x.year
= 2017
和实例Two
ModelA
具有modelb_date
属性= [v, w]
,其中v.year
= 2018
,然后查询将在Two
之前对实例One
进行排序。 / p>
我正在使用Django 2.0,python 3.6和Oracle 12c。
有人可以帮忙吗?谢谢!
答案 0 :(得分:1)
如果您要按相关模型的某个值进行订购,并具有一对多关系,那么您需要某种方式来首先进行“ 折叠” ”相关的数据:例如,采用 minimum , maximum (并根据数据类型, sum ,平均值< / em>等也可能是有效的选项。
例如,如果我们要根据相关ModelA
项目的最小值 date
对ModelB
进行排序,则可以使用{{ 1}}和.annotate(..)
组合,例如:
.order_by(..)
因此,在这里,我们将ModelA.objects.filter(...).prefetch_related(
Prefetch(
'modelb_set',
queryset=ModelB.objects.filter().order_by('-year'),
to_attr="modelb_date"
)
).annotate(
first_date=Min('modelb__date')
).order_by('-first_date')
与ModelA
按降序顺序进行排序,而first_date
是first_date
的最低{相关date
。