Kri*_*ian 23 django django-models
我有一个简单的模型,看起来像这样:
class Group(models.Model):
name = models.CharField(max_length = 100, blank=False)
Run Code Online (Sandbox Code Playgroud)
我希望这会抛出完整性错误,但它不会:
group = Group() # name is an empty string here
group.save()
Run Code Online (Sandbox Code Playgroud)
如何确保name变量设置为非空?即使数据库拒绝任何保存空字符串的尝试?
bal*_*azs 16
在这种情况下,从Django文档中,您name将被存储为空字符串,因为null默认情况下字段选项为False.如果要定义自定义默认值,请使用defaultfield选项.
name = models.CharField(max_length=100, blank=False, default='somevalue')
Run Code Online (Sandbox Code Playgroud)
在此页面上,您可以看到与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')
Run Code Online (Sandbox Code Playgroud)
或者你可以替换ValidationError其他东西.你叫那之前group.save()调用group.full_clean(),它将调用clean()
其他验证相关的事情在这里.
不需要您手动调用的另一个选项clean是使用此选项:
name = models.CharField(max_length=100, blank=False, default=None)
Run Code Online (Sandbox Code Playgroud)
blank 将阻止在模型中提供空字符串default=None将在使用时将名称设置为None group = Group(),从而在调用时引发异常save我花了很长时间寻找这个简单(和旧)问题的最佳解决方案,而从 Django 2.2 开始,实际上有一个非常简单的答案,所以我会写在这里以防有人仍然遇到同样的问题:
从 Django 2.2 开始,我们可以定义CheckConstraints,因此很容易定义一个非空字符串约束:
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")
]
Run Code Online (Sandbox Code Playgroud)
或者你可以简单地使用MinLengthValidator1-char最小值:
from django.core.validators import MinLengthValidator
class Company(BaseModel):
"""Company"""
name = models.CharField(max_length=255,
validators=[MinLengthValidator(1)])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9641 次 |
| 最近记录: |