Django 生成自定义 ID

     2023-03-24     28

关键词:

【中文标题】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 你造成了伤害,恕我直言,这会给性能带来很多麻烦 @SukanyaPai max 的值需要 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_keyunique=Trueeditable=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)有像“+”这样... 查看详情