【发布时间】:2017-08-20 04:56:51
【问题描述】:
我有一个有点复杂的模型,所以我会尽力举一个例子来简化我当前的状态和我的需求。
我有一个查询集:
qs = MyModel.objects.all()
这个查询集中的每个实例,对于另一个模型都有一个many-2-many 字段,我们称之为'First_M2M'。 First_M2M 对另一个模型有一个外键,对另一个模型(分别为 FkModel 和 Second_M2M)有一个多对多对:
qs[0].first_m2m.fk_model.name # This is a string.
qs[0].first_m2m.second_m2m.all() # This is a many2many manager.
Second_M2M 有另一个多对多关系,Third_M2M:
qs[0].first_m2m.second_m2m[0].third_m2m.all() # Also a m2m manager.
现在这就是我想要做的:我想根据来自 second_m2m 实例之一的值订购我的 qs。但是,我需要选择它是哪个实例,这是通过查询 fk_model 中的一个字段(以确定 first_m2m 实例)和 third_m2m 中一个实例中的一个字段(这将确定 second_m2m)来完成的。
为了让它更有趣,排序的值是 YAML。
这是我尝试做的:
qs.annotate(val_to_filter_by=Case(
When(
first_m2m__fk_model__name='foo',
first_m2m__second_m2m__third_m2m__some_field='bar'),
then='first_m2m__second_m2m__value_field',
default=Value(None),
output_field=YAMLField()
)
).order_by(val_to_filter)
我相信我的错误在于查询,它不够连贯,让 Django 无法确定它应该采用哪个实例。但我找不到我的问题。
任何帮助将不胜感激。
【问题讨论】:
标签: django many-to-many django-orm django-annotate