Django模型字段:在默认关键字上引用self

时间:2012-11-14 20:07:05

标签: python django django-models

我一直遇到问题需要理解这一点,并想出一种在模型字段的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,因为它只是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)

3 个答案:

答案 0 :(得分:4)

我认为没有办法在默认的callable中访问self。还有其他一些方法可以设置您的字段值:

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

如前所述,覆盖模型的save()方法,为special_code分配值。字段的default选项并不意味着依赖于模型的其他字段,因此这不起作用。

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

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

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