在 Django 中过滤时如何忽略或跳过 table 的空值?
How to ignore or skip null values of table when filtering in Django?
当数据库中该子句的数据为 null 时,我想忽略或跳过该子句,在我的例子中,有时 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 时它将不起作用,我想忽略这些情况并仅通过该条件,我该怎么做?
我试过 When 子句:
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(<b>digital_exp_score=None</b>) |
Q(<b>digital_exp_score__gte=review.digital</b>),
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(<b>digital_exp_score__lt=review.digital</b>),
is_personalized=True,
)
这里波浪号 (~
) 是条件的否定。
当数据库中该子句的数据为 null 时,我想忽略或跳过该子句,在我的例子中,有时 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 时它将不起作用,我想忽略这些情况并仅通过该条件,我该怎么做?
我试过 When 子句:
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(<b>digital_exp_score=None</b>) |
Q(<b>digital_exp_score__gte=review.digital</b>),
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(<b>digital_exp_score__lt=review.digital</b>),
is_personalized=True,
)
这里波浪号 (~
) 是条件的否定。