python - 在 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
)
解决方案
您可以使用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,
)
这里波浪号 ( ~
) 是条件的否定。
推荐阅读
- ios - Xamarin iOS 特征收集警告错误
- node.js - 如果 include 在 sequelize 中没有找到任何关系数据,则设置属性的 null 值
- android - Android - 如何从设置活动中更改 EditText 背景颜色?
- c# - C# 使用 XmlReader 和 XmlWriter 解析 XML
- nestjs - 我应该在哪里更改从客户收到的值?在 Nest.js 中
- mysql - 我的 mysql 程序(包含光标)有什么问题?
- security - 通过查询字符串参数 (GET) 搜索表单 - 隐私问题
- azure-devops - 如何在 DevOps Pipeline PowerShell 任务中设置变量并将该变量用作另一个任务的条件
- wordpress - 排除类别 woocommerce
- javascript - 发送带有 Post Form et 的图像,在 based64 中使用节点 Js 进行编码