Django ORM 实现非主键自增字段的方法

清欢
清欢
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍在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实现非主键自增的完整内容,希望对大家有所帮助,欢迎支持。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表