Django 2.0-通过预取相关属性上的字段对查询集进行排序

时间:2018-09-26 13:10:06

标签: django orm

我的目标是对一个模型运行查询,但根据通过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。

有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:1)

如果您要按相关模型的某个值进行订购,并具有一对多关系,那么您需要某种方式来首先进行“ 折叠” ”相关的数据:例如,采用 minimum maximum (并根据数据类型, sum 平均值< / em>等也可能是有效的选项。

例如,如果我们要根据相关ModelA项目的最小值 dateModelB进行排序,则可以使用{{ 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_datefirst_date的最低{相关date