Python 在Django中过滤时,如何忽略或跳过表的空值?

Python 在Django中过滤时,如何忽略或跳过表的空值?,python,django,datatable,filtering,isnull,Python,Django,Datatable,Filtering,Isnull,我想忽略或跳过一个筛选子句,当该子句的数据在数据库中为空时,在我的情况下,有时digital_exp_score变量为空,但我需要根据该变量进行筛选,正常筛选如下: review = Review.objects.get(id=review_id) offers = OfferGeneric.objects.filter( is_personalized=True, digital_exp_score__gte=review.dig

我想忽略或跳过一个筛选子句,当该子句的数据在数据库中为空时,在我的情况下,有时digital_exp_score变量为空,但我需要根据该变量进行筛选,正常筛选如下:

review = Review.objects.get(id=review_id)
offers = OfferGeneric.objects.filter(
                is_personalized=True,
                digital_exp_score__gte=review.digital
)
但当digital_exp_分数为空时,它将不起作用,我想忽略这些情况,只是通过那个条件,我如何做到这一点

我试过使用When条款:

offers = OfferGeneric.objects.filter(
                is_personalized=True,
                When(digital_exp_score__isnull=False ,
                     then=(digital_exp_score__gte=review.digital)
                     ),
)

但两者都不起作用,我得到语法错误,那些方法只针对条件右边的值?是否有任何方法检查条件左侧的值(DB值)

像这样的东西很理想:

offers = OfferGeneric.objects.filter(
                is_personalized=True,
                digital_exp_score__gte=review.digital if digital_exp_score is not None else pass
)
    

我想这就行了

OfferGeneric.objects.exclude(digital_exp_score__isnull=true) \
                    .filter(is_personalized=Treu,digitial_score__gte=review.digital)
虽然我想它会和你的另一个问题一起工作。。。因为我不认为NULL会通过大于测试。。。也许我误解了你的意图

根据您的评论,正确的查询是

from django.models import Q
OfferGeneric.objects.filter(Q(OfferGeneric.digital_score__gte=review.digital) | 
                            Q(OfferGeneric.digital_score__isnull=True)).all()
可以使用对析取进行编码。a的逻辑等价性→ b是a∨ b:


这里的波浪号(
~
)是对条件的否定。

不,它不起作用,因为它将排除所有数字exp评分为Null的报价,我想要的是获得满足此条件的所有报价digital exp评分=review.digital,但当数字exp评分为Null时,我只想跳过该过滤器,通过这种方式,我可以获得该字段也为null的报价。那么我该怎么做呢?是的,现在它会像那样工作,但是为什么最后会出现
.all()
?我想你不需要它。。。它只是一种习惯,如果
digital\u exp\u score
NULL
,您不想检查
digital\u exp\u score
。如果不为null,则希望将对象保留在queryset中?是的,确实如此,可以这样做吗?谢谢!这很好用!这是一个很好的解释,反向查询非常有用!最后一个问题,在过滤器中,
|
是一个OR right?,所以每个“,”逗号都是一个AND?所以我可以用
&
来代替逗号?@OOSS:如果你使用
Q
对象,你可以使用
&
,如果我们使用命名参数,就像上一个一样,那么你就不能使用
&
(或者
),因为这就是Python解析参数的方式。但是在内部,
.filter(…)
确实会创建
Q
对象,执行
&
逻辑来共同构造一个对象,然后将该
Q
对象转换为它正在构造的SQL查询的一部分。
from django.models import Q
OfferGeneric.objects.filter(Q(OfferGeneric.digital_score__gte=review.digital) | 
                            Q(OfferGeneric.digital_score__isnull=True)).all()
from django.db.models import Q

review = Review.objects.get(id=review_id)

offers = OfferGeneric.objects.filter(
    Q(digital_exp_score=None) |
    Q(digital_exp_score__gte=review.digital),
    is_personalized=True,
)
from django.db.models import Q

review = Review.objects.get(id=review_id)

offers = OfferGeneric.objects.filter(
    ~Q(digital_exp_score__lt=review.digital),
    is_personalized=True,
)