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'))
自定义一个通用的函数,可以更方便地复用这种判断逻辑。