如何在Django中创建一个非空的CharField?

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()

其他验证相关的事情在这里.

  • 避免需要确保`full_clean()`的一种方法是使用`Charfield(默认=无)`.这将引发`IntegrityError`而不是'ValidationError` (8认同)

rpt*_*t57 8

不需要您手动调用的另一个选项clean是使用此选项:

name = models.CharField(max_length=100, blank=False, default=None)
Run Code Online (Sandbox Code Playgroud)
  • blank 将阻止在模型中提供空字符串
  • default=None将在使用时将名称设置为None group = Group(),从而在调用时引发异常save

  • “空白将阻止在模型中提供空字符串”。这是错误的。它仅防止在管理员或使用正确表单或序列化程序的任何地方传递空字符串。它不会阻止 `Model.objects.create(name="")` 或 `model.name = ""; 模型.save()`。 (2认同)

Lot*_*ram 8

我花了很长时间寻找这个简单(和旧)问题的最佳解决方案,而从 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)


Ric*_*rdo 6

或者你可以简单地使用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)

  • 当您使用 instance.save() 或 model.create() 保存模型时,这将不起作用。仅在使用 ModelForm 时有效。检查 https://docs.djangoproject.com/en/dev/ref/validators/#how-validators-are-run (5认同)