Python中如何在Django Model中设置字段默认值并应用到数据库表

django,在 model 中建立一个 State 字段,默认值为‘ 1 ’,
class test(models.Model):
State = models.CharField( maxlength=1, default=‘1’)
同步到数据库后,发现表 test 的 State 字段并没有默认值。
查了一下,说这里 default 属性是应用在新建对象的时候的。在建表中,并不起作用。
那么我现在想在表中设置默认值,在 django 怎么做?(当然可以直接修改数据库,但是这样不好,而且 default 太多的话,会带来很多问题)
Python中如何在Django Model中设置字段默认值并应用到数据库表


13 回复

不是很懂你的具体需求,新添加一条记录的时候,你不赋值,就默认一个 1,表里设置默认值什么意思


在Django Model中设置字段默认值,主要涉及两个层面:模型层面的默认值和数据库层面的默认值。通常我们只需要处理模型层面。

1. 模型层面的默认值(最常用) 直接在字段定义中使用default参数:

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    # 设置静态默认值
    category = models.CharField(max_length=50, default='uncategorized')
    
    # 设置动态默认值(使用可调用对象)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    # 使用函数作为默认值
    import uuid
    product_code = models.CharField(max_length=36, default=uuid.uuid4)
    
    # 使用lambda函数
    status = models.IntegerField(default=lambda: 1)

2. 数据库层面的默认值 如果需要数据库层面也设置默认值,可以使用db_default参数(Django 4.2+):

class Order(models.Model):
    total_amount = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        db_default=0.00  # 数据库层面的默认值
    )
    created_date = models.DateField(
        db_default="CURRENT_DATE"  # 使用数据库函数
    )

3. 应用到数据库表的步骤 设置完字段默认值后,需要生成并应用迁移:

python manage.py makemigrations
python manage.py migrate

重要说明:

  • default参数只在Django创建新对象时生效
  • db_default会在数据库层面强制执行默认值
  • 对于已存在的记录,新增字段时需要特别处理空值问题

总结建议:优先使用模型层面的default参数,需要数据库约束时才用db_default

观点同一楼,你一个空表,数据没有,怎么可能有默认值。当你创建一个数据,不给这个数值赋值,自然会出现 1 了。

你这种想法,就和腾讯给没有未注册 QQ 号的 QQ 号已经填充好了个人资料一样,其他数据已经就位,就差被人注册了。而腾讯即使有设定的默认值,也只有一个人创建了 QQ 号时才能一起被设定到一条数据中。

是要给老的数据为空的数据增加一个默认值么?
’’‘python
b = test.objects.all()
for x in b:
x.State = default

’’’

是要给老的数据为空的数据增加一个默认值么?
’’‘
b = test.objects.all()
for x in b:
x.State = default
x.save()
’’’

好像数据库并不能设置默认值

因为不是所有数据库的所有字段都支持设置默认值,所以在 django-orm 里 default 是由逻辑实现的。
一定要设,就是自己改生成的 migration 文件,用 sql 语句添加 default,然后你还要考虑是否会产生逻辑冲突。

你如果真的要让 Django 建表的时候给字段加上默认值,只能修改 Django 建表的代码,文件大概是在 site-packages/django/db/backends/creation.py ,参考 https://stackoverflow.com/questions/6153482/django-models-default-value-for-column

是不是说你在查看表结构的时候,default,没有你表里设置的那个值

是的,在数据库中看表结构,没有 default 的值

这个是它特性,这个默认值不是写在表结构里,而是说你在使用 model 实例化一个对象保存的时候,djadjango 自己帮你设置一个这样的值,达到可以设置默认值的效果

回到顶部