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

我正在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


如何更改代码,以便在每次添加新对象时获得不同的时间戳?


www说
浏览 125回答 1
1回答

翻阅古今

正如你可能在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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python