查询集过滤器使用 Case/When 作为模型字段,而不是字段值
Queryset filter using Case/When for Model field, not field value
我想合并两个查询集,或者更好的是,针对特定情况只使用 Case/When 语法创建一个查询集。
我在 documentation 中看到它可以用于查询集过滤,而不仅仅是注释,这正是我所需要的。但是,我想对模型字段本身使用 Case/When,而不是字段的值。
该项目是一个电子商务项目,我使用的是 django-oscar,所以这里的模型非常大 post。需要知道的是,篮子线是指产品,产品可以是父产品、子产品或独立产品。
这是我的代码:
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()
组合两个查询集?
您可以为此使用 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)
我想合并两个查询集,或者更好的是,针对特定情况只使用 Case/When 语法创建一个查询集。
我在 documentation 中看到它可以用于查询集过滤,而不仅仅是注释,这正是我所需要的。但是,我想对模型字段本身使用 Case/When,而不是字段的值。
该项目是一个电子商务项目,我使用的是 django-oscar,所以这里的模型非常大 post。需要知道的是,篮子线是指产品,产品可以是父产品、子产品或独立产品。
这是我的代码:
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()
组合两个查询集?
您可以为此使用 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)