1

我可以做这个:

counter = 0

class A(models.Model):
  code = models.IntegerField(max_length=30, default=generate_code)

def generate_code():
  counter += 1
  return counter

但似乎是,分配是在模型类的初始化(加载)期间完成的,而不是在创建实例时完成,所以“代码”总是“1”。

在创建模型类的实例期间,如何自动为某个字段分配动态值?

如果我在覆盖__init__函数中设置值,如下所示:

class A(models.Model):

    def __init__(self, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self.code = self.generate_code()

代码在每次更新时都会更改。正如调试器向我展示的那样 __init__,当我删除对象时,也会调用该函数。我真的不明白这个!

如果没有设置,我只能在__init__函数中设置代码,但这似乎不合逻辑,所以我想避免它。

4

1 回答 1

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对象来封装该数据。

于 2012-12-12T23:32:13.150 回答