我有一个简单的模型,如下所示:
class Group(models.Model):
name = models.CharField(max_length = 100, blank=False)
我希望这会抛出完整性错误,但它不会:
group = Group() # name is an empty string here
group.save()
如何确保name变量设置为非空?即,让数据库拒绝任何保存空字符串的尝试?
答案 0 :(得分:15)
在这种情况下,Django docs会将name
存储为空字符串,因为默认情况下null
字段选项为False。如果要定义自定义默认值,请使用default
字段选项。
name = models.CharField(max_length=100, blank=False, default='somevalue')
在此页面上,您可以看到blank
与数据库无关。
<强>更新强>
您应该覆盖模型的清理功能,以进行自定义验证,因此您的模型def将为:
class Group(models.Model):
name = models.CharField(max_length=100, blank=False)
def clean(self):
from django.core.exceptions import ValidationError
if self.name == '':
raise ValidationError('Empty error message')
或者您可以将ValidationError
替换为其他内容。然后在致电group.save()
致电group.full_clean()
之前致电clean()
其他与验证相关的事情是here。
答案 1 :(得分:6)
或者你可以简单地使用MinLengthValidator
和1-char最小值:
from django.core.validators import MinLengthValidator
class Company(BaseModel):
"""Company"""
name = models.CharField(max_length=255,
validators=[MinLengthValidator(1)])
答案 2 :(得分:6)
另一个不需要您手动调用clean
的选项就是使用它:
name = models.CharField(max_length=100, blank=False, default=None)
blank
将阻止在您的模型中提供空字符串default=None
之类的内容时,group = Group()
会将名称设置为无,从而在调用save
答案 3 :(得分:1)
Django的验证系统假定所有字段都是必需的,除非你提到它可以留空......
您是否在管理员中注册了课程?当你把它留空时会显示错误吗?
答案 4 :(得分:0)
我花了很长时间寻找这个简单(旧)问题的最佳解决方案,而从Django 2.2开始,实际上有一个非常简单的答案,因此我将在这里写出来,以防万一有人仍然遇到相同的问题。问题:
从Django 2.2开始,我们可以定义(CheckConstrainsts)[https://docs.djangoproject.com/en/2.2/ref/models/constraints/#checkconstraint],因此很容易定义一个非空字符串约束:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=32)
class Meta:
constraints = [
models.CheckConstraint(check=~models.Q(title=""), name="non_empty_title")
]