为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用预定义的 aplphabetic 部分声明基于时间的字母数字 id 字段

如何使用预定义的 aplphabetic 部分声明基于时间的字母数字 id 字段

www说 2022-08-02 16:09:05
我正在Django中开发一个应用程序。我想在我的模型中插入一个自动递增的字母数字唯一ID字段,默认情况下,具有固定的字母部分和自动递增的数字部分。但我也希望可用性从管理部分将此ID更改为另一个字母数字,具有不同的字母数字和数字部分。我试图实现这一点,但事实证明,尝试实现这样一个字段并使其成为模型的自动字段会在我的数据库中产生问题。所以我正在改变我的目标:现在我想实现一个基于时间的字母数字唯一字段,其中包含预定义的aplphabetic部分。请注意:我不想覆盖django默认id字段,我只想在我的模型中包含一个字段,该字段获取一个唯一的自定义字母数字值作为默认值。以下是我在 models.py 中所做的:def return_timestamped_id():    prefix = "ITCH"        import time    this_time = time.time()    this_time  = this_time  *10000000    this_time  = int(this_time)    timestamp = str(this_time)    default_value = prefix + timestamp    return(default_value)class object_example(models.Model):    name = models.CharField(max_length=256, blank=True, null=True)        Id_generated = models.CharField(max_length=256, blank=False, null=False, unique=True, default=return_timestamped_id())问题是,当我从管理部分向此模型添加对象时,The 总是相同的。Id_generated我期望每次添加新对象时都会调用该函数。很明显,它只是调用一次,然后将相同的返回值传递给每个新对象。return_timestamped_id()Id_generated如何更改代码,以便在每次添加新对象时获得不同的时间戳?
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

正如你可能在Django文档中看到的,你可以使用一个值或一个可调用作为默认值。如果您使用可调用的(例如函数),则每次需要默认值时都会调用它。


问题:您正在传递值,因为您正在调用函数 。该函数被调用一次,当您的模块(models.py)导入到应用程序中时。default=return_timestamped_id()


解决方案:传递函数本身default=return_timestamped_id


你可以在django.models.Fields类中看到相关的代码(注释我的):


class Field():

    def __init__(self, ..., default=NOT_PROVIDED,...):

        ...

        self.default = default  # save the default as a member variable

        ...


    def get_default(self):

        """Return the default value for this field."""

        return self._get_default()


    @cached_property

    def _get_default(self):

        if self.has_default():

            if callable(self.default):  # if it is callable, return it

                return self.default

            return lambda: self.default # else wrap in a callable


查看完整回答
反对 回复 2022-08-02
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号