【发布时间】:2018-09-26 13:10:05
【问题描述】:
我的目标是在一个模型上运行查询,但根据通过 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 上的一个字段,它是一个列表。我想要的是根据最新的关联date 字段(来自ModelB)订购ModelA 查询集。也就是说,如果ModelA 的实例One 具有modelb_date 属性= [x, y, z] 其中x.year = 2017 并且ModelA 的实例Two 具有modelb_date@8 属性= @9876543 v.year = 2018 那么查询将在 One 之前排序实例 Two。
我正在使用 Django 2.0、python 3.6 和 Oracle 12c。
有人可以帮忙吗?谢谢!
【问题讨论】:
-
这没有多大意义,因为 one
ModelA将映射到 multipleModelBs,所以这不是一个好的标准.您需要“折叠”这些值(例如,minimum、maximum 等) -
另外作为参考,一个写两个下划线,所以
modelb__date。 -
假设我需要得到一个按所述排序的
ModelA查询集,我是否需要使用额外的查询和Case和When做一些更复杂的事情? -
不,只是用
Min(..)注解,然后按注解排序。 -
我很困惑;
Min只能在ModelA的字段上工作,对吧?我正在尝试在ModelB上找到一个字段的Min。我可以用RawSQL做到这一点,但它运行速度很慢......