【问题标题】:How to declare a time-based alphanumerical id field with predefined aplphabetic part (Django model)如何使用预定义的字母部分(Django 模型)声明基于时间的字母数字 id 字段
【发布时间】:2020-06-01 07:13:30
【问题描述】:

我正在用 Django 开发一个应用程序。

我想在我的模型中插入一个自动递增的字母数字唯一 ID 字段,默认情况下具有固定的字母部分和自动递增的数字部分。但我也希望可用性从管理部分更改为另一个字母数字的,具有不同的字母数字和数字部分。

tryed 来实现这个,但结果是试图实现这样一个字段并使其成为模型的自动字段会在我的数据库中产生问题。

所以我改变了我的目标:现在我想实现一个基于时间的字母数字唯一字段,其中包含预定义的字母部分。 请注意:我不想覆盖 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())

问题在于,当我从管理部分向该模型添加对象时, Id_generated 总是一样的。

我希望每次添加新对象时都会调用return_timestamped_id() 函数。很明显,它只调用一次,然后将相同的返回值传递给每个新对象的Id_generated

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

【问题讨论】:

  • 你想要default=return_timestamped_id 没有()

标签: python django django-models timestamp unique


【解决方案1】:

正如您可能在Django docs 中看到的那样,您可以使用值或可调用对象作为默认值。如果您使用可调用对象(例如函数),那么每次需要默认值时都会调用它。

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

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

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

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

【讨论】:

  • 谢谢,我预计传递“default=return_timestamped_id()”意味着“传递函数,没有输入”。然后我希望如果稍后我更改我的函数以便它接受一个输入(例如 default=return_timestamped_id(input_1),那么我将输入“default=return_timestamped_id(input_1)”。它正确吗?
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多