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

2024-09-27 07:34:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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
)
    

Tags: trueobjectsis情况filter条件reviewscore
2条回答

我想这就行了

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()

可以使用^{} 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),
    is_personalized=True,
)

这里的tilde(~)是条件的否定

相关问题 更多 >

    热门问题