【问题标题】:How to make an IntegerField/CharField be auto-incrementing field in Django as 1000001, 1000002如何使 IntegerField/CharField 在 Django 中自动递增字段为 1000001、1000002
【发布时间】:2019-03-21 21:04:39
【问题描述】:

我在模型中有一个字段“CharField”,当用户创建项目时,如何使 IntegerField/CharField 成为 Django 中默认的自动递增字段 1000001、1000002?或year + 00001、00002、0003 等,我不能拥有多个 AutoField,并且该字段已经有很多数据。

【问题讨论】:

标签: django python-3.x auto-increment


【解决方案1】:

解决方案是将您的字段设为自动字段。如果您将其设为自动字段,则 django 不会添加导致错误的主键

不能有多个 AutoField。 您需要将主键显式指定为

field = models.AutoField(primary_key=True) # or False

从 1000001 开始计数最好的方法是修改迁移文件。这取决于您使用的数据库。如果您使用 Postgres,那么它看起来像这样。迁移中的编辑操作或运行 SQL 命令 DB 命令提示符:

operations = [
    migrations.CreateModel(...),
    # mysql specific
    migrations.RunSQL('alter table tablename auto_increment=1000001'),
]

alter 命令将根据您使用的数据库而改变。

如果您想要自定义 AutoField,那么您可以创建一个 char 字段并将可编辑设置为 false。然后手动指定值。参考:https://techstream.org/Web-Development/Custom-Auto-Increment-Field-Django

【讨论】:

  • 嗨,谢谢你帮我解决这个问题,我使用的是Postgres,当我执行update tablename set auto_increment=1000001;时,已经更新了3371条记录,当我执行./manage.py migrate时,我得到了一个错误django.db.utils.DataError: setval: value 0 is out of bounds for sequence "tablename_auto_increment_seq" (1..9223372036854775807)?
  • 错误应该是django.db.utils.IntegrityError: could not create unique index "tablename_auto_increment_0e4a9f27_uniq" DETAIL: Key (auto_increment)=(1000001) is duplicated.,因为我在数据库中有几条关于这个字段的记录。
  • 您是否设置了自动增量字段的声明位置。 alter table tablename auto_increment=1000001 将为您执行此操作。或 ALTER SEQUENCE field_name RESTART WITH 1000001;我没有测试它。所以我不知道哪一个会起作用。
  • 嗨,是的,我已经为自增字段设置了声明位置,alter table tablename auto_increment=1000001,问题是自增字段有很多记录,数据库的自增字段现在有3371条记录= 1000001,
  • 1) 您将自动递增字段设置为主键。您不能允许重复值。 2)我认为在 postgres 中,自动增量字段的类型是 SERIAL 和 ALTER SEQUENCE field_name RESTART WITH 1000001;是你需要设置的初始值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2014-02-03
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
相关资源
最近更新 更多