我正在研究一些Django,并遇到了一个小问题。
我正在寻找一种方法,使suit_length默认等于顾客的身高。这种代码对我有用:
class Customer(models.Model):
name = models.CharField(max_length=20)
height = models.IntegerField(default=170)
class Suit(models.Model)
customer = models.ForeignKey(Customer)
suit_design = models.CharField(max_length=100)
suit_length = models.IntegerField(default=0)
def get_height(self):
self.suit_length = self.customer.height
return
但每次我创建一个新的Suit时,它的默认suit_length = 0,我必须运行get_height()才能得到我想要的东西。有没有办法将suit_length默认为customer.height并避免每次创建新套装时都运行get_height()?我可能正在寻找像这样的人:
class Customer(models.Model):
name = models.CharField(max_length=20)
height = models.IntegerField(default=170)
class Suit(models.Model)
customer = models.ForeignKey(Customer)
suit_design = models.CharField(max_length=500)
suit_length = models.IntegerField(default=lambda:self.customer.height)
但是这段代码不起作用。
答案 0 :(得分:8)
Django使用save()方法实际保存数据。您可以像这样覆盖它:
class Suit(models.Model):
def save(self):
if self.suit_length == 0:
self.suit_length = self.customer.height
super(Suit, self).save()
它不会覆盖默认值,但它会实现您的目标。
答案 1 :(得分:0)
您希望在运行时不变量为真,这就是说西服的初始长度等于客户的身高。
执行此操作的pythonic方法不涉及__ init __()吗?
class Suit(models.Model)
customer = models.ForeignKey(Customer)
suit_design = models.CharField(max_length=500)
suit_length = models.IntegerField(default=lambda:self.customer.height)
def __init__(self, args, kwargs):
super(models.Model, args, kwargs)
if kwargs['customer']:
self.customer = kwargs['customer']
# this creates the invariant
self.suit_length = self.customer.height
else:
raise ValueError("Must have a customer before constructing a Suit")
# More code for suit_design, etc.
}