2012-11-14 63 views
4

我一直有问题,明白这一点,并拿出做一个参考selfdefault关键字示范田内的一种方式:的Django模型字段:参考自上默认的关键字

这里我有什么:

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)) 

所以我试图访问类的定义,这似乎不工作了,因为蟒蛇不知道里面自哪里自我是因为它不是一个对象呢。

我已经尝试不同的东西,如:

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) 
+2

如果给number和bank.number的默认值会发生什么?如果为空,则尝试在模型类的save()方法中设置special_code。 – PepperoniPizza

+0

感谢您的想法。我要post_save检查special_code为空,然后只填充一次我想要的数据。 –

回答

4

我不认为有任何的方式来访问默认调用的自我。有几种其他方法来设置字段的值:

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

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

+1

我正在寻找一个post_save信号,而不是重写save方法,但它几乎是一样的。 –

2

前面已经回答了,覆盖模型的save()方法将值分配给special_code。字段的default选项并不意味着依赖于模型的其他字段,所以这不起作用。

此外,看看editable选项,如果你不希望该字段被编辑。

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

将阻止外地在您根据模型创建ModelForms呈现。