为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕沐林林 2023-08-08 10:52:48
当数据库中该子句的数据为空时,我想忽略或跳过该子句,在我的情况下,有时 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)
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

您可以使用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 NULL` 本身的对象. Django will then automatically include :


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,

)

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


查看完整回答
反对 回复 2023-08-08
?
慕斯709654

TA贡献1840条经验 获得超5个赞

我想这样就可以了

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


查看完整回答
反对 回复 2023-08-08
  • 2 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信