2016-01-19 2 views
3

Я использую Django 1.9.1, Python 3.5. models.py:Django. Значение по умолчанию из внешнего ключа

class Item(models.Model): 
    name = models.CharField(max_length=200) 
    price = models.FloatField() 
    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Lot(models.Model): 
    item = models.ForeignKey(Item) 
    count = models.IntegerField(default = 1) 
    price = models.FloatField(default = 1) #Price on the moment of buying 
    def __str__(self):    # __unicode__ on Python 2 
     return self.item.name 

    def cost(self): 
     return self.price * self.count 

Я хочу, чтобы создать объект Лота Атмосферостойкого по умолчанию price = item.price. То есть цена на момент покупки. Поэтому я не могу получить значение price из Lot.item.price, потому что это может быть иначе. Когда код models.py такова:

class Lot(models.Model): 
    item = models.ForeignKey(Item) 
    count = models.IntegerField(default = 1) 
    price = models.FloatField(default = item.price) #Price on the moment of buying 
    def __str__(self):    # __unicode__ on Python 2 
     return self.item.name 

    def cost(self): 
     return self.price * self.count 

Я получаю следующее сообщение об ошибке:

AttributeError: 'ForeignKey' object has no attribute 'price' 

Как я должен исправить этот код?

ответ

1

Вы должны переопределить Lot.save, чтобы установить значение по умолчанию для цены.

class Lot(models.Model): 
    item = models.ForeignKey(Item) 
    price = models.FloatField() 
    .... 

    def save(self, *args, **kwargs): 
     if not self.price: 
      self.price = self.item.price 
     super(Lot, self).save(*args, **kwargs) 
2

default в вашем определении модели не является «экземпляром». Я бы предложил переопределить метод сохранения Lot, чтобы потянуть цену во время сохранения.

class Lot(models.Model): 

    item = models.ForeignKey(Item) 
    count = models.IntegerField(default = 1) 
    price = models.FloatField(default = item.price) #Price on the moment of buying 
    def __str__(self):    # __unicode__ on Python 2 
     return self.item.name 

    def save(self, *args, **kwargs): 
     if self.item: # verify there's a FK 
      self.price = self.item.price 
     super(Lot, self).save(*args,**kwargs) # invoke the inherited save method; price will now be save if item is not null 

    def cost(self): 
     return self.price * self.count 
Смежные вопросы