在 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,
)

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