【问题标题】:How can I create custom ID in django?如何在 django 中创建自定义 ID?
【发布时间】:2020-10-16 16:59:39
【问题描述】:

据我所知,我们可以使用 UUIDField() 创建自定义 ID。

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

但是如何更改看起来像 AAYYMMDDNNNN 的 ID

在哪里,

⦁ 前 2 个字符 - 'AA'

⦁ YY - 捕获其注册的年份

⦁ MM - 捕获其注册的月份

⦁ DD - 捕获其注册的当前日期

⦁ NNNN - 基于每天新的 NNNN 集合生成的随机数 (0001 - 9999)

【问题讨论】:

  • 使用 id = models.CharField(max_length=12, primary_key=True, default=generate_id) 其中generate_id 是您的自定义函数,它返回预期的 ID
  • 你能告诉我如何创建自定义函数来返回预期的输出吗?
  • @ruddra 提供了正确答案

标签: django django-models django-forms django-views django-templates


【解决方案1】:

你可以这样试试:

import random
from django.utils import timezone

def generate_pk():
    number = random.randint(1000, 9999)
    return 'AA{}{}'.format(timezone.now().strftime('%y%m%d'), number)

class YourModel(models.Model):
   id = models.CharField(default=generate_pk, primary_key=True, max_length=255, unique=True)

更新

基于 cmets 更新,因为你想跟踪今天是否有任何实例创建并增加 NNNN 的计数器,你不能使用函数来生成默认值。而是尝试像这样覆盖保存方法:

import random
from django.utils import timezone

class YourModel(models.Model):
   special_id = models.CharField(max_length=255, null=True, default=None)

   def save(self,*args, **kwargs):
       if not self.special_id:
           prefix = 'AA{}'.format(timezone.now().strftime('%y%m%d')
           prev_instances = self.__class__.objects.filter(special_id__contains=prefix))
           if prev_instances.exists():
              last_instance_id = prev_instances.last().special_id[-4:]
              self.special_id = prefix+'{0:04d}'.format(int(last_instance_id)+1)
           else:
               self.special_id = prefix+'{0:04d}'.format(1)
       super(YourModel, self).save(*args, **kwargs)
        

【讨论】:

  • 感谢您的宝贵时间,非常抱歉没有具体说明,实际上我想要从 0001-0002-0003 等开始直到 9997 - 9998 - 9999 的号码。我也没有认为它会每天产生新的一组NNNN???
  • 抱歉,新的 NNNN 集是什么意思?另外,这个字段需要是主键吗?
  • 例如,今天将生成的 ID 将是 AA2006260001 - AA2006260002 - AA2006260003 等到 AA2006269999 .. 明天,ID 将生成像 AA2006270001-AA2006270002 - AA2000627909 到 AA2000627909 , Id 会生成像 AA2006280001-AA2006280002 - AA2006280003 直到 AA2006289999 等等
  • @sodmzs 如果我可以插话,请使用该代码作为起点。期望别人为你编写所有代码是相当不礼貌的。
  • 谢谢你Sooooo MUCCCCCHHHH!!!!你是个了不起的人!!!!!!!!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2023-03-26
  • 2014-09-06
  • 2016-01-16
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多