Django ORM:检查字段是空白还是已填充

Django ORM: checking if a field is blank or filled

title = models.ForeignKey(blank=True, null=True)

我正在尝试检查 title filed 是填充还是空白,我该如何实现?

您可以通过isnull

检查字段是否为空
YourModel.objects.filter(title__isnull=True)

这将 return 所有没有标题的 objects。

I am trying to check if title filed is filled or blank, how can i achieve this?

blank 不是 值。空白表示表单中不需要该字段(不会显示)。通常如果 blank=True,那么 null=True 也是如此(或者您需要提供一个明确的默认值)。

您可以使用 None,它是 Python 等同于 NULL,例如:

MyModel.objects.filter(<b>title=None</b>)

或者您可以使用 __isnull [Django-doc] 查找使其更明确:

MyModel.objects.filter(<b>title__isnull=True</b>)

因此,querysets and q objects 周围的 Django 文档将成为您的朋友。

一开始检查是 null 还是 ''(空)有点棘手,但是一旦你理解了 SQL 和 Django ORM,它就会变得更容易。

首先要说明的是 null != '' 和 SQL 它们是两个不同的值。前两个对此 post 的回答不正确,因为他们没有阅读您的问题。

基本上,您可以根据用例执行三项检查,

  1. 结果是否为空 - YourModel.objects.filter(title='')
  2. 结果是否为空 - YourModel.objects.filter(title__isnull=True)
  3. 结果是否为 null 或空(使用 Q objects)- YourModel.objects.filter(Q(title='') | Q(title__isnull=True))

在您的情况下,您需要选项 3,因为您要求的结果集在结果集中显示空值和空值。

示例:

#  models.py
class TestModel(models.Model):
    a = models.CharField(max_length=10, blank=True, null=True)

#  code
TestModel.objects.create() # id: 0
TestModel.objects.create(a='') # id: 1
TestModel.objects.create(a='a value') # id: 2

# option 1 above
TestModel.objects.filter(a__isnull=True)
#> <QuerySet [<TestModel: TestModel object (1)>]>

#option 2 above
TestModel.objects.filter(a='')
#> <QuerySet [<TestModel: TestModel object (2)>]>

#option 3 above
from django.db.models import Q
TestModel.objects.filter(Q(a='') | Q(a__isnull=True))
#> <QuerySet [<TestModel: TestModel object (1)>, <TestModel: TestModel object (2)>]>