【问题标题】:Queryset filter using Case/When for Model field, not field value使用案例/何时作为模型字段的查询集过滤器,而不是字段值
【发布时间】:2018-05-27 05:21:22
【问题描述】:

我想组合两个查询集,或者更好的是,针对特定案例使用 Case/When 语法只创建一个。

我在documentation 中看到它可以用于查询集过滤,而不仅仅是注释,这正是我所需要的。但是,我想将 Case/When 用于模型字段本身,而不是字段的值。

该项目是一个电子商务项目,我使用 django-oscar,所以模型很大,可以在这里发布它们。要知道的是,一个篮子线是指一个产品,一个产品可以是父级、子级或独立的。

这是我的代码:

self.in_stock_lines = basket.lines.filter(product__product_class__track_stock=True, is_customized=False)

问题是,如果购物篮行与子产品相关,我必须过滤的字段是 product__parent__product_class__track_stock,而如果它与独立产品(没有父产品)相关,则它保持 product__product_class__track_stock,如我的初始查询集。

有没有办法做到这一点?还是我别无选择,只能使用 itertools.chain() 组合两个查询集?

【问题讨论】:

  • 请发布您的模型.....另外,看看mptt,它可能更容易实现您正在寻找的东西。当您拥有一个产品的产品时会发生什么?...github.com/django-mptt/django-mptt
  • 我编辑了我的问题,我认为模型太大,无法在此处发布(电子商务)。但是不能有产品的产品,它代表父/子关系或独立(单独)。

标签: django django-queryset django-oscar


【解决方案1】:

您可以为此使用 Q 对象。

from django.db.models import Q

basket.lines.filter(
  Q(product_parent__isnull=True, product__product_class__track_stock=True) | 
  Q(product__parent__product_class__track_stock=True), is_customized=False)

【讨论】:

    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2015-05-18
    • 2021-08-05
    • 1970-01-01
    • 2021-09-27
    • 2013-10-10
    相关资源
    最近更新 更多