我可以这样做:
counter = 0
class A(models.Model):
code = models.IntegerField(max_length=30, default=generate_code)
def generate_code():
counter += 1
return counter
但似乎是,分配是在模型类的初始化(加载)期间完成的,而不是在创建实例时完成,因此'code'始终为'1'。
如何在创建模型类实例期间自动为某些字段指定动态值?
如果我在覆盖__init__
函数中设置值,如下所示:
class A(models.Model):
def __init__(self, *args, **kwargs):
models.Model.__init__(self, *args, **kwargs)
self.code = self.generate_code()
每次更新时代码都会发生变化。正如调试器向我显示的那样,当我删除对象时,也会调用__init__
函数。我真的不明白这个!
我只能在__init__
函数中设置代码,如果没有设置,但这似乎是不合逻辑的,所以我想避免它。
答案 0 :(得分:1)
您是否只是想找到一种方法来确保数据库中的每个A对象都具有唯一的计数器值?然后,您可以使用AutoField
代替IntegerField
:
https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.AutoField
当您创建新的A
对象时,其counter
值将自动设置为高于之前创建的值。
为了解释您所看到的一些行为,每次加载models.py时,它确实会将新的counter
变量初始化为0,如您所知。至于为什么在你不期望它时调用A
构造函数,A
只是一个表示来自数据库的一些数据的类。因此,每当Django从数据库中获取数据并将其呈现给您时,它就会创建一个新的A
对象来封装该数据。