我一直遇到问题需要理解这一点,并想出一种在模型字段的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)
答案 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中呈现字段。