Django CharField 作为主键仍然允许保存 Null 值

Posted

技术标签:

【中文标题】Django CharField 作为主键仍然允许保存 Null 值【英文标题】:Django CharField as primary key still allow Null value to be save 【发布时间】:2020-12-26 09:33:31 【问题描述】:

目前我有以下模型,我想将 CharField 设置为主键(我的数据库是 mysql

class Customer(models.Model):

    class Meta:
        db_table = "customers"
        verbose_name = _('Customer')
        verbose_name_plural = _('Customers')

    customer_id = models.CharField(_('Customer ID'),max_length=255, primary_key=True)
    name = models.CharField(_('Name'), max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

在document 中声明:

primary_key=True 意味着 null=False 和 unique=True。只有一个初级 对象上允许使用键。

在Mysql中,主键的结构如下:

customer_id, type=varchar(255), collat​​ion=latin1_swedish_ci, Attributes=blank Null=No, Default=None,Comments=blank, Extra=blank

但是当我尝试对主键使用 null 值的 save() 方法时:

Customer.objects.create(customer_id=None, name="abc")

它仍然在主键中保存 Null 值而不返回任何错误或验证,这是为什么呢?

编辑: 在 Mysql 中保存后,它会显示 customer_id=blank 的值(当尝试将其保存为 None 时)。为什么保存 customer_id=None 时设置为空白?

【问题讨论】:

【参考方案1】:

当你第一次创建对象时

Customer.objects.create(customer_id=None, name="abc")

它将customer_id值存储为''(空值,不为null),到目前为止我们还没有创建其他对象,所以它也是唯一的。

现在当你再次创建一个客户对象时

Customer.objects.create(customer_id=None, name="xyz")

这将引发错误django.db.utils.IntegrityError: UNIQUE constraint failed: customers.customer_id,因为我们的customer_id 值中已经有空值。所以,这是抛出 UNIQUE 约束的错误

【讨论】:

以上是关于Django CharField 作为主键仍然允许保存 Null 值的主要内容,如果未能解决你的问题,请参考以下文章

Django 模型 - 外键作为主键

我的Django模型中只有一个主键,但是它显示为多个主键时出错

Django-Admin:作为 TextArea 的 CharField

如何获取主键相关字段嵌套序列化器django rest框架的所有值

Django使用主键创建视图

Django ORM基本的增删改查