2015-04-25 2 views
0

Вот мои модели:Расчет в Джанго модели

class Consignment(models.Model): 
    number = models.IntegerField(unique=True) 
    creation_date = models.DateTimeField() 
    expiration_date = models.DateTimeField() 
    package_ammount = models.IntegerField() 
    price = models.DecimalField(max_digits=12, decimal_places=2) 
    volume = models.DecimalField(max_digits=8, decimal_places=3) 
    image = models.ImageField() 
    brand = models.ForeignKey(Brand) 
    def __unicode__(self): 
     return self.brand.name + ' ' + str(self.volume) + ' liters' 

class ProductPackage(models.Model): 
    consignment = models.ForeignKey(Consignment) 
    ammount_in_package = models.IntegerField() 
    total_volume = consignment.volume*ammount_in_package 
    total_width = models.DecimalField(max_digits=6, decimal_places=3) 
    total_height = models.DecimalField(max_digits=6, decimal_places=3) 
    total_length = models.DecimalField(max_digits=6, decimal_places=3) 
    package_price = consignment.price*ammount_in_package 

Проблема с package_price поле. Он вычисляет package_price, что основано на price модели Consignment и ammount_in_package модели ProductPackage. Но этот код вызывает ошибки и ошибки, когда makemigrationsForeignKey' object has no attribute 'volume' И будет package_price будет отображаться на странице admin? Мне это не нужно, потому что он автоматически вычисляется, администратору не нужно изменять его.

ответ

2

package_price должен быть свойством, как это:

class ProductPackage(models.Model): 
    ... 
    @property 
    def package_price(self): 
     return self.consignment.price * self.ammount_in_package 

Вы можете показать это свойство в администратора, добавив его в list_display. И, конечно же, не доступны для редактирования в админ :-)

0

Вы должны сделать это в get/set методов или рассмотреть возможность использования property (который я бы не посоветуете в любом случае):

def get_package_price(self): 
    return consignment.price*ammount_in_package 

package_price = property(_get_package_price) 

См. the Django docs для получения дополнительной информации.

Смежные вопросы