猿问

在 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

                ),

)

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


像这样的东西是理想的:


offers = OfferGeneric.objects.filter(

                is_personalized=True,

                digital_exp_score__gte=review.digital if digital_exp_score is not None else pass

)


慕沐林林
浏览 156回答 2
2回答

烙印99

您可以使用Q对象 [Django-doc]来编码析取。a → b的逻辑等价是← a ∨ b:from django.db.models import Qreview = 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 NULL` 本身的对象. Django will then automatically include :from django.db.models import Qreview = Review.objects.get(id=review_id)offers = OfferGeneric.objects.filter(    ~Q(digital_exp_score__lt=review.digital),    is_personalized=True,)这里波浪号 ( ~) 是条件的否定。

慕斯709654

我想这样就可以了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()
随时随地看视频慕课网APP

相关分类

Python
我要回答