关键词:
【中文标题】Django 生成自定义 ID【英文标题】:Django generate custom ID 【发布时间】:2018-08-29 06:03:26 【问题描述】:我看到了this answer,但还没有具体的答案。我想创建以字母开头的自定义id
。当新记录进入数据库时,我想将id
更改为 A00001,...A00002,...A00010,...A10000 等。id
将始终在99999- 00001
范围内,所以如何我可以这样做吗?
我的模型很简单:
class Custom(models.Model):
id = models.AutoField(primary_key=True, editable=False)
【问题讨论】:
你会用这个做什么?如果你想创建一个自动递增整数的id
,你需要一个 DBMS,比如 MySQL,或者一个使用 In-Memory DB 的数字计数器,比如 Redis。
用于生产应用程序。他们想要这种id
格式
@Telmunn 使用 id 作为 Integer 并创建另一个字段或属性,将 'A00~' 格式字符串添加到 id 怎么样?
【参考方案1】:
AutoField
字段是 IntegerField
字段的一种,因此不能将 PK 用作 A00001
。所以,实现要求的可能方法是将 AutoField
更改为 CharField
。技术上您可以使用 “字符串 PK 字段” 但是,如果要使用它,您应该注意问题/性能问题。
在这里,我找到了一篇很好的 SO 帖子,解释了相同的内容 - Strings as Primary Keys in SQL Database============================= ============================================
如果您仍然真的希望迁移到 String PKs,请阅读以下内容
首先你需要使用 CharField
而不是 AutoField
并覆盖模型的 save()
方法
from django.db.models import Max
class Custom(models.Model):
id = models.CharField(primary_key=True, editable=False, max_length=10)
name = models.CharField(max_length=100)
def save(self, **kwargs):
if not self.id:
max = Custom.objects.aggregate(id_max=Max('id'))['id_max']
self.id = ":05d".format('A', max if max is not None else 1)
super().save(*kwargs)
【讨论】:
@BearBrown 对不起,我不明白你的意思。可以直接编辑吗? 这段代码很难在生产环境中使用。如果多个用户同时尝试,则会引发 IntegrityError。 @JPG 你造成了伤害,恕我直言,这会给性能带来很多麻烦 @SukanyaPaimax
的值需要 int
类型,在你的情况下,它是str
.
我不得不修改这条分配给 self.id 的行,如下所示: self.id = ":05d".format('A', int(max[1:])如果 max 不是 None else 1) 观察切片完成并转换为 max 变量中的 int。现在为了解决获取正确 id_max 的问题,我遵循了这个:custom=Custom.objects.last() (new line) max=custom.id if custom is not None else None【参考方案2】:
如果您打算对表进行引用,则字符串作为主键不是一个好主意,因此我建议您添加一个属性,例如:
class Custom(models.Model):
id = models.AutoField(primary_key=True, editable=False)
@property
def sid(self):
return "A%05d" % self.id
要进行查询,您可以处理输入值,例如:
s_input = "A%05d" % 231 # 'A00231'
number = s_input[1:] # '00231'
input_id = int(number) # 231
【讨论】:
我认为应该修改缩进。 很高兴为您提供帮助 @BearBrown 我在我的 Django 模型中尝试了你的方法,但我的 id 字段在创建时仍然获得默认的 1、2、3 值。你能帮忙吗?我做了同样的事情,应用了迁移,然后启动了服务器并创建了数据。 @SukanyaPai 在这个解决方案中,数据库中的 PK 仍然是整数,只有属性sid
是字符串
@Bear Brown 是否意味着 sid 属性是我应该跟踪的新 ID?我检查了我的数据库,我的表中没有 sid。我也执行了 makemigrations 和 migrate 操作。你能告诉我哪里出错了吗?【参考方案3】:
我还有另一种方法,我在我的 django 项目中使用。这是一些代码
def ids():
no = Employee.objects.count()
if no == None:
return 1
else:
return no + 1
emp_id = models.IntegerField(('Code'), default=ids, unique=True, editable=False)
id = models.CharField(primary_key=True, editable=False, max_length=30)
def save(self, **kwargs):
if not self.id:
self.id = ":08d".format('ABC', self.emp_id)
super().save(*kwargs)
【讨论】:
【参考方案4】:最好为模型中的自定义 id 和后端的流程创建一个新字段。您可以将其设置为 primary_key
和 unique=True
和 editable=False
:
class Custom(models.Model):
id = models.Autofield(primary_key=True, editable=False, max_length=10)
uid= models.CharField(max_length=100, unique=True)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.set_uid() # calling the set_uid function
def set_uid(self):
if not self.uid: # if uid of the instance is blank
uid = "CUS" + str(self.id + (10 ** 5)) # generating the uid
customer= Custom.objects.get(id=self.id) # getting the instance
customer.uid = uid # allocating the value
customer.save() # saving the instance
def __str__(self):
return self.uid
还可以在调用函数的save()
中合并set_uid()
:
class Custom(models.Model):
id = models.Autofield(primary_key=True, editable=False, max_length=10)
uid= models.CharField(max_length=100, unique=True)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if not self.uid: # if uid of the instance is blank
self.uid = "CUS" + str(self.id + (10 ** 5)) # generating the uid and allocating the value
self.save() # saving the instance
def __str__(self):
return self.uid
【讨论】:
【参考方案5】:我尝试使用@JPG 的答案,但它有一个错误。 该错误是因为它不能自动递增。 我修复了这个错误,这是我的结果代码:
def save(self, **kwargs):
if not self.id:
max = YourModel.objects.aggregate(
id_max=models.Max('id'))['id_max']
if max is not None:
max += 1
else:
max = 100
self.id = ":08d".format(
max) # id from 100 to start
super().save(*kwargs)
【讨论】:
django定义模型类(代码片段)
...;模型类被定义在应用文件夹下的model.py中模型类必须继承Django的models.Model类属性名不能用连续的两条下划线__主键:primarykey,简写pk不需要主动定义,django会自动生成自增长的主键,属性名叫 id,如果开发者自己定义了主键,... 查看详情
如何在 Django 会话模型中设置自定义字段?
】如何在Django会话模型中设置自定义字段?【英文标题】:HowtosetacustomfieldinaDjangosessionmodel?【发布时间】:2017-06-1523:33:33【问题描述】:我已经根据this延长了Django中的会话。总之,我添加了一个名为account_id的字段来保存会话所... 查看详情
springjpa主键生成采用自定义id,自定义id采用年月日时间格式
自定义主键生成策略在entity类上添加注解@Id@GeneratedValue(strategy=GenerationType.AUTO,generator="custom-id")@GenericGenerator(name="custom-id",strategy="com.h5page-mapdiy.utils.CustomIDGenera 查看详情
如何用自定义变量替换 DJANGO 中 JAVASCRIPT 脚本生成的 Google Map Key
】如何用自定义变量替换DJANGO中JAVASCRIPT脚本生成的GoogleMapKey【英文标题】:HowtoreplaceGoogleMapKeygeneratedbyJAVASCRIPTscriptinDJANGObyacustomvariable【发布时间】:2020-02-0206:27:32【问题描述】:我正在尝试找到一种方法来隐藏我在javascript脚本... 查看详情
Django 中的自定义 url 模式
】Django中的自定义url模式【英文标题】:customurlpatternsinDjango【发布时间】:2019-07-0302:22:02【问题描述】:我有一个我正在尝试建立供个人使用的网站,它有两个id,一个用于会议(进行比赛),一个用于活动(比赛编号)。事件... 查看详情
prisma:如何生成自定义 ID 而不是“ckasdasdw”?
】prisma:如何生成自定义ID而不是“ckasdasdw”?【英文标题】:prisma:HowtogenerateCustomidinsteadof\'ckasdasdw\'?【发布时间】:2020-08-1618:11:42【问题描述】:目前,Prisma数据库给我们每个用户的id以CK开头.....我需要改变它。有什么方法可... 查看详情
id 主键是不是必须在从 inspectdb 针对现有数据库生成的 Django 模型中显式定义?
】id主键是不是必须在从inspectdb针对现有数据库生成的Django模型中显式定义?【英文标题】:DoidprimarykeyhavetobeexplicitlydefinedinDjangomodelsgeneratedfrominspectdbagainstanexistingdatabase?id主键是否必须在从inspectdb针对现有数据库生成的Django模型... 查看详情
为具有复合 ID 的实体自定义 HATEOAS 链接生成
】为具有复合ID的实体自定义HATEOAS链接生成【英文标题】:CustomizingHATEOASlinkgenerationforentitieswithcompositeids【发布时间】:2014-07-1104:20:40【问题描述】:我在PageAndSortingRepository上配置了一个RepositoryRestResource,该PageAndSortingRepository访... 查看详情
Django 自定义标签
】Django自定义标签【英文标题】:Djangocustomtags【发布时间】:2012-07-0702:57:15【问题描述】:我正在构建一个自定义标签,我必须在其中传递多个参数。我可以使用,分隔列表作为args进行操作,但是在传递该列表中的对象时我遇到... 查看详情
自定义 Django 表单不保存
】自定义Django表单不保存【英文标题】:CustomDjangoFormNotSaving【发布时间】:2013-10-1519:32:56【问题描述】:我正在尝试使用thismethod自定义表单的输出。例如:<divclass="fieldWrapper">form.message.errors<labelfor="id_message">Yourmessage:<... 查看详情
为 socket.io 生成自定义套接字 id
】为socket.io生成自定义套接字id【英文标题】:Generatecustomsocketidforsocket.io【发布时间】:2021-12-2903:22:25【问题描述】:根据socket.iodocumentationforgeneratingcustomid这应该可以工作:constexpress=require(\'express\');constapp=express();constserver=requir... 查看详情
[oldboy-django][2深入django]form组件实现生成:select下拉框,checkbox复选框,radio单选框以及如何实现自定义数据格式要求
1需求-1Form组件如何实现生成选择类标签:select,check,radio-默认值-保留上次输入的值-2自定义验证规则-RegexField--ViewCode 查看详情
Django:自定义对象 json 序列化
】Django:自定义对象json序列化【英文标题】:Django:customobjectjsonserialization【发布时间】:2014-05-1923:39:56【问题描述】:我想以json格式序列化一个自定义对象,其中entryData是我的域对象的列表。像这样的:"total":2,"current":1,"entryDat... 查看详情
生成自定义标识
】生成自定义标识【英文标题】:Generatecustomid【发布时间】:2021-09-0814:20:28【问题描述】:我需要根据该表中的其他3列生成自定义ID(即主键)。这3列是散列的,因此我得到id作为主键。我可以使用Hibernate和@GenericGenerator执行类... 查看详情
Django Rest Framework 自定义身份验证 + 返回自定义 json
】DjangoRestFramework自定义身份验证+返回自定义json【英文标题】:DjangoRestFrameworkCustomAuthentication+returncustomjson【发布时间】:2019-02-0202:06:57【问题描述】:我正在使用django2.1和python3.6....我想使用自定义身份验证对用户进行身份验证... 查看详情
django之orm操作(代码片段)
...键,只需在其中一个字段中指定primary_key=True即可。如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。 查看详情
java示例代码_为grails中的域类生成自定义字母数字id
java示例代码_为grails中的域类生成自定义字母数字id 查看详情
Tomcat 7/JBoss7 的自定义会话 ID 生成器
】Tomcat7/JBoss7的自定义会话ID生成器【英文标题】:CustomsessionidgeneratorforTomcat7/JBoss7【发布时间】:2011-11-0923:13:23【问题描述】:伙计们,我的web应用需要URL安全的会话ID。那些由JBoss7生成的(在JBoss中嵌入了Tomcat7)有像“+”这样... 查看详情