Django:在实例化期间为模型类中的字段赋值

时间:2012-12-12 23:24:50

标签: django django-models initialization

我可以这样做:

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__函数中设置代码,如果没有设置,但这似乎是不合逻辑的,所以我想避免它。

1 个答案:

答案 0 :(得分:1)

您是否只是想找到一种方法来确保数据库中的每个A对象都具有唯一的计数器值?然后,您可以使用AutoField代替IntegerFieldhttps://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.AutoField

当您创建新的A对象时,其counter值将自动设置为高于之前创建的值。

为了解释您所看到的一些行为,每次加载models.py时,它确实会将新的counter变量初始化为0,如您所知。至于为什么在你不期望它时调用A构造函数,A只是一个表示来自数据库的一些数据的类。因此,每当Django从数据库中获取数据并将其呈现给您时,它就会创建一个新的A对象来封装该数据。