文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Django自定义ID自增

2024-12-01 13:01

关注

ID自增

Django models里面ID自增通常使用models.AutoField(auto_created=True, primary_key=True)来定义主键,但是如何自定义ID自增怎么做呢?类似于在ID前面添加固定字符串如:AE8600000001、AE8600000002、AE8600000003……

案例分析

很显然上面的AutoField字段不能使用,因为AutoField字段是IntegerField字段,所以不能将pk用来AE860000001,从目标字段来看,很显然是字符串类型,所以只能将字段类型改为CharField,但是呢,如果数据量巨大,字符串作为主键显然是不理智的选择,这样会严重影响到查询性能问题,但是也不是不可使用。这样必须重写models里面的save方法,达到字段自增的目的(其实也可以用另外一张表记录ID游标的方式也可,但是个人觉得比较麻烦,不知道有没有大神知道更为简便的方法)。

获取最大值ID

class TestNew(models.Model):
sequence_ID = models.CharField(primary_key=True, editable=False, max_length=50)
def save(self, *args, **kwargs):
if not self.sequence_ID:
max_id = TestNew.objects.aggregate(id_max=Max('sequence_ID'))['id_max']
self.sequence_ID = "{}{:08d}".format("AE86", max_id + 1 if max_id is not None else 1)
super().save(*args, **kwargs)

弊端

重写save方法固然好用,但是有一种创建数据的方式不行,那就是批量创建的方法不适用,因为它的底层不调用save方法,objects.bulk_create这个方法,咱们可以看一下底层源码:

def bulk_create(self, objs, batch_size=None):
"""
Inserts each of the instances into the database. This does *not* call
save() on each of the instances, does not send any pre/post save
signals, and does not set the primary key attribute if it is an
autoincrement field (except if features.can_return_ids_from_bulk_insert=True).
Multi-table models are not supported.
"""pass

写到这里,估计你们会产生疑问,这样写会不会出现问题,在生产环境能用吗?如果多个用户同时尝试,那么他就会发生IntegrityError错误。你们可以试试……

自定义方法

上面的方法存在一定的弊端,如果咱们每次重写save方法的时候去查询一下目前表里面的数量,创建临时字段ID,在此基础上加1是否可行?

class TestNew(models.Model):

def ids():
c_no = TestNew.objects.count()
if c_no == None:
return 1
else:
return c_no + 1
emp_id = models.IntegerField(('Code'), default=ids, unique=True, editable=False)
sequence_ID = models.CharField(primary_key=True, editable=False, max_length=50)
def save(self, *args, **kwargs):
if not self.sequence_ID:
self.sequence_ID = "{}{:08d}".format("AE86", self.emp_id))
super().save(*args, **kwargs)

这种发法也会和上面一样,如果多用户使用,也会产生IntegrityError错误。啊啊啊,有没有大神求教,目前只能这样实现了。

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯