Django ORM非空判断、以及通用写法

django文档

Django ORM中,判断非空(not null)有多种方式,

使用isnull查询方法

py 复制代码
# 查找所有name字段不为空的对象
objects = MyModel.objects.filter(name__isnull=False)

使用exclude方法排除空值:

py 复制代码
# 查找所有name字段不为空的对象
objects = MyModel.objects.exclude(name__isnull=True)

使用blank=False和null=False设置字段属性

py 复制代码
from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100, blank=False, null=False)
    # 这样定义的name字段在数据库中不允许为空

在Model方法中进行判断

py 复制代码
class MyModel(models.Model):
    name = models.CharField(max_length=100)

    def is_name_not_null(self):
        return self.name is not None

使用clean方法进行验证

py 复制代码
from django.core.exceptions import ValidationError

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    def clean(self):
        if self.name is None:
            raise ValidationError({'name': 'Name cannot be null.'})

这些方法各有优缺点,具体使用时需要根据具体的业务需求和使用场景进行选择。比如在查询时使用isnull或exclude方法更加简单高效,而在Model中设置字段属性或重写clean方法可以在保存时进行更复杂的验证。

通用写法

在Django ORM中,通过表达式来判断字段是否为空是非常常见的需求。您提到的ar_address__isnull=True是一个具体的例子,那么如何编写更通用的表达式来实现这种判断呢?

使用 Q 对象:

python 复制代码
from django.db.models import Q

# 判断 ar_address 字段是否为空
qs = MyModel.objects.filter(Q(ar_address__isnull=True))

Q 对象可以用于构建复杂的查询条件,这种方式更加灵活。

使用 IsNull 表达式:

py 复制代码
from django.db.models import IsNull

# 判断 ar_address 字段是否为空
qs = MyModel.objects.filter(IsNull('ar_address'))

IsNull 表达式也可以用于判断字段是否为空。

使用 Case 和 When 表达式

python 复制代码
from django.db.models import Case, When, BooleanField

# 判断 ar_address 字段是否为空
qs = MyModel.objects.annotate(
    is_ar_address_null=Case(
        When(ar_address__isnull=True, then=True),
        default=False,
        output_field=BooleanField()
    )
)

这种方式可以将判断结果作为一个新的字段添加到查询集中,方便后续的处理。

使用自定义的函数

python 复制代码
def is_field_null(field_name):
    return Q(**{f"{field_name}__isnull": True})

# 判断 ar_address 字段是否为空
qs = MyModel.objects.filter(is_field_null('ar_address'))

自定义一个通用的函数,可以更方便地复用这种判断逻辑。

相关推荐
团儿.23 分钟前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
向上的车轮28 分钟前
Django学习笔记十一:部署程序
笔记·学习·django
程序猿小D34 分钟前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
权^1 小时前
MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
大数据·数据库·学习·mysql
Code成立2 小时前
1、深入理解Redis线程模型
数据库·redis·bootstrap
缘友一世4 小时前
macos安装mongodb
数据库·mongodb·macos
万事大吉CC5 小时前
mysql单表查询·3
数据库·mysql
bin91536 小时前
【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。
大数据·数据库·信息可视化·数据挖掘·数据分析·excel·数据可视化
Miqiuha6 小时前
lock_guard和unique_lock学习总结
java·数据库·学习
一 乐7 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习