【问题标题】:Django annotate single instance of many-2-many field using 'when' on other fields of the instnceDjango在实例的其他字段上使用'when'注释many-2-many字段的单个实例
【发布时间】: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


    【解决方案1】:

    解决了...

    我的'then'有误。这是我的“案例”而不是“何时”的一部分。这是解决方案:

    qs.annotate(val_to_filter=Case(
                                When(
                                    first_m2m__fk_model__name='foo',
                                    first_m2m__second_m2m__third_m2m__some_field='bar',
                                    then=F('first_m2m__second_m2m__value_field')
                                    ),
                                   default=Value(''),
                                   output_field=YAMLField()
                                   )).order_by(val_to_filter)
    

    更新:没有解决...

    虽然我得到了正确的查询,而且它有效,但我得到的是 second_m2m 的所有实例,而不是单个实例。仍然不确定如何得到我需要的东西,在这种情况下似乎 Django 不是我的朋友。

    更新 2: 更改了 'default=None' 并添加了

    .exclude(val_to_filter=None)
    

    就在订购之前。似乎工作......

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 2021-09-20
      相关资源
      最近更新 更多