4

我在理解这一点并想出一种方法来引用模型字段的关键字self内部时遇到了问题:default

这是我所拥有的:

class Bank(models.Model):
    number = models.CharField(max_length=10)

class Account(models.Model):
    bank = models.ForeignKey(Bank, related_name="accounts")
    number = models.CharField(max_length=20)
    created = models.DateTimeField(auto_now_add=True)
    creator = models.ForeignKey(User)
    # This is the guy
    special_code = models.CharField(max_length=30, default='%s-%s' % (self.number, self.bank.number))

所以我试图在类定义中访问 self ,这似乎行不通,因为 python 不知道 self 在哪里,因为它还不是一个对象。

我尝试了不同的方法,例如:

special_code = models.CharField(max_length=30, default='%s-%s' % (number, bank.number))

但在这种情况下,它无法识别bank.number,因为 bank 它只是一个带有models.ForeignKey.

我也尝试过在Account类中使用一种方法:

def bank_number(self):
    return self.bank.number

进而:

special_code = models.CharField(max_length=30, default='%s-%s' % (number, bank_number()))

这有点愚蠢,因为它仍然需要自我。有没有办法我可以做到这一点?

我需要它将数字存储在数据库中,因此使用这样的方法将无济于事:

def special_number(self):
    return '%s-%s' % (self.number, self.bank.number)
4

3 回答 3

6

我认为在默认的可调用对象中没有任何方法可以访问 self 。还有其他几种设置字段值的方法:

如果您不希望用户能够更改值,请覆盖模型的保存方法并将其设置在那里。

如果默认值只是一个建议,并且您确实希望允许用户更改它,然后覆盖模型表单的__init__方法,那么您可以访问 self.instance 并更改设置字段的初始值。

于 2012-11-14T20:24:23.790 回答
3

您可能希望覆盖该save()方法并在将对象存储到数据库中之前填充该字段,而不是为该字段指定默认值。该save()方法还可以访问self. 这是文档中的一个示例:

https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

于 2012-11-14T20:25:03.387 回答
2

正如已经回答的那样,覆盖save()模型的方法以将值分配给special_code. 字段的default选项并不意味着依赖于模型的其他字段,因此这不起作用。

editable此外,如果您不想编辑该字段,请查看该选项。

special_code = models.CharField(max_length=30, editable=False)

将阻止在您从模型创建的 ModelForms 中呈现该字段。

于 2012-11-14T20:31:10.213 回答