问题描述
当数据库中该子句的数据为空时,我想忽略或跳过该子句,在我的情况下,有时digital_exp_score变量为Null,但是我需要按该变量进行过滤,普通过滤器将像这样:
review = Review.objects.get(id=review_id)
offers = OfferGeneric.objects.filter(
is_personalized=True,digital_exp_score__gte=review.digital
)
但是,当digital_exp_score为Null时,它将不起作用,我想忽略这些情况,只通过该条件,我该怎么做?
我尝试了“当”子句:
offers = OfferGeneric.objects.filter(
is_personalized=True,When(digital_exp_score__isnull=False,then=(digital_exp_score__gte=review.digital)
),)
和
offers = OfferGeneric.objects.filter(
is_personalized=True,digital_exp_score__gte=When(
digital_exp_score__isnull=False,then=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()
,
您可以使用Q
objects [Django-doc]来编码析取。 a→b 的逻辑等价为¬a∨b :
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,)
或者我们可以简单地过滤掉digital_exp_score
不小于review.digital . Django will then automatically include
NULL`本身的对象:
from django.db.models import Q
review = Review.objects.get(id=review_id)
offers = OfferGeneric.objects.filter(
~Q(digital_exp_score__lt=review.digital),)
此处波浪号(~
)是条件的否定。