Django ORM 实现非主键自增字段的方法
本文介绍在Django ORM中如何实现非主键字段的自增功能。通过设置IntegerField并配置auto_created=True,结合数据库层面的AUTO_INCREMENT属性,可实现唯一自增。同时对比了默认自增ID与自定义ID的区别,提供具体代码示例及注意事项。
Django非主键自增实现方案
在Django的ORM框架中,若需实现字段自增,通常直接使用AutoField即可。但需注意,AutoField要求该字段必须作为主键,而一个数据表仅能有一个主键。
当数据表中已存在主键,但仍需另一个字段具备唯一自增特性时,应如何处理?
以下提供一种解决方案,供参考交流,也欢迎分享其他实现方式,共同学习。
代码示例与数据库配置
class ProductSpu(models.Model):
"""
商品表
"""
_database = 'payment'
id = models.UUIDField(primary_key=True, default=uuid.uuid4, db_column='c_id')
product_no = models.IntegerField('商品号', blank=True, auto_created=True, db_column='c_product_no')
name = models.CharField(verbose_name='商品名称', max_length=100, db_column='c_name')
以product_no字段为例,该字段需实现自增功能。
第一步,将该字段定义为IntegerField类型,并设置属性auto_created=True。
第二步,生成对应的数据库SQL语句,配置如下。
CREATE TABLE `ehr-payment`.`t_product_spu` (
`c_id` char(32) NOT NULL,
`c_product_no` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品编码',
`c_name` varchar(100) NOT NULL COMMENT '商品名称',
PRIMARY KEY (`c_id`),
UNIQUE KEY `c_product_no` (`c_product_no`)
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8 COMMENT='商品表';
通过上述两步配合,新增数据时product_no字段会自动填充自增值。其中,SQL配置中指定AUTO_INCREMENT=100001,表示自增起始值为100001。
Django默认自增ID机制
补充知识:Django中关于自增ID的相关问题。
在Django中创建模型时,若未显式指定id字段,Django会自动生成一个自增的id字段。
默认自增ID示例
class Student(models.Model):
name = models.CharField(max_length=16)
sex = models.CharField(max_length=4)
例如,以下模型结构会自动添加自增id。
在数据库表结构中,该id字段表现为自增类型。
具体字段包括id、name和sex。
这相当于默认生成的自增主键结构。
class Student(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
sex = models.CharField(max_length=4)
因此,该id字段具有自增特性。
自定义非自增ID设置
若需自定义id,且希望该id值由用户自行指定,则需进行如下调整。
class Student(models.Model):
u_id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=16)
sex = models.CharField(max_length=4)
将AutoField替换为IntegerField即可。
此时创建的数据,其数据库中的id值不再自增,可在插入SQL时指定u_id的具体值,如3、6、8等。
但需注意,自定义id值不能重复。
以上即为基于Django ORM实现非主键自增的完整内容,希望对大家有所帮助,欢迎支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









