You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django的CharField字段上设置NOT NULL非空约束

Django CharField设置NOT NULL约束解决方案

核心参数说明

先明确Django模型字段两个易混淆参数的作用:

  • null:控制数据库层面的约束,默认值为False,设置为False时对应数据库字段会加上NOT NULL约束,禁止存储NULL值
  • blank:控制Django表单/Admin层面的校验,默认值为False,设置为False时表单提交不允许该字段为空

方案实现

仅需要数据库禁止NULL值

你当前的代码默认已经满足要求,所有未显式设置null=True的字段,生成表结构时都会自动加上NOT NULL约束。如果需要显式声明增强可读性,修改代码如下:

class Tutors(models.Model):
    # 显式声明null=False,数据库层面禁止存NULL
    first_name = models.CharField(max_length=20, null=False)
    last_name = models.CharField(max_length=20, blank=False, null=False)
    email = models.EmailField(max_length=254)
    birth_day = models.DateField(auto_now=False, auto_now_add=False)

    def __str__(self):
        return self.first_name + ' ' + self.last_name

需要同时禁止存储空字符串

如果你的需求是连空字符串''、全空白字符串也不允许存入,需要增加模型校验逻辑:

from django.core.exceptions import ValidationError

class Tutors(models.Model):
    first_name = models.CharField(max_length=20, null=False)
    last_name = models.CharField(max_length=20, blank=False, null=False)
    email = models.EmailField(max_length=254)
    birth_day = models.DateField(auto_now=False, auto_now_add=False)

    def clean(self):
        # 校验字段不为空白字符串
        if not self.first_name.strip():
            raise ValidationError("first_name 不能为空白内容")
        if not self.last_name.strip():
            raise ValidationError("last_name 不能为空白内容")
    
    def save(self, *args, **kwargs):
        # 保存前自动触发校验逻辑
        self.full_clean()
        super().save(*args, **kwargs)

    def __str__(self):
        return self.first_name + ' ' + self.last_name

注意事项

  • 不要给CharField类型字段设置null=True,否则会允许数据库存储NULL和空字符串两种空值,增加后续业务判断成本
  • 如果是已经存在数据的表要新增NOT NULL约束,需要先给现有数据补全对应字段的值,否则执行migrate时会触发报错

内容的提问来源于stack exchange,提问作者jarjarbinks99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:39:03