首页 > 解决方案 > 在 Django 中过滤时如何忽略或跳过表的空值?

问题描述

当该子句的数据在数据库中为空时,我想忽略或跳过过滤器子句,在我的情况下,有时 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_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
                ),
)

但两者都不起作用,我得到语法错误,这些方法仅适用于条件右侧的值?有什么方法可以检查条件左侧的值(数据库值)吗?

像这样的东西是理想的:

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

标签: pythondjangodatatablefilteringisnull

解决方案


您可以使用Q对象 [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),
    is_personalized=True,
)

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


推荐阅读