2013-08-08 4 views
0

Я пытаюсь получить общую цену для ManyToManyField. Я получаю каждую индивидуальную цену на price_for_each_item, а затем я хочу, чтобы в общей сложности, однако многие предметы были в том, чтобы добавить к «TOTAL_PRICE»Получение общей стоимости для ManyToManyField в Django

class PurchaseOrder(models.Model): 
    number_of_products = models.ManyToManyField('Product', null =True) 
    total_price = models.FloatField(verbose_name='Total Price') 

class Product(models.Model): 
    products = models.CharField(max_length=256, null =True) 
    price_for_each_item = models.FloatField(verbose_name = "Price") 

    def __unicode__(self): 
     return self.products 

Например, если бы я сделал заказ на Macbook Pro = $ 500, Asus Computer = $ 200, а mousepad = 50 долларов. Я бы хотел, чтобы общее количество этого было в total_price = $ 750

EDIT: Я пробовал делать это, но безрезультатно. Кто-нибудь знает, что мне нужно сделать, чтобы исправить это? Когда я пытаюсь отобразить это говорит не поплавок объект вызываемого

def get_total_price(self): 
     return ([p.price_for_each_item for p in self.total_price()]) 
+1

Вы уверены, что ваша структура модели имеет смысл? Если продукт состоит из нескольких элементов, вы должны создать дополнительную модель «Предмет» и иметь поле «Много-ко-многим» в Product, ссылаясь на него? Или если у продукта действительно есть только одна цена, вместо того, чтобы называть поле «price_for_each_item», вы должны просто назвать его «цена». По сути, это очень запутанно. – MikkoP

+0

Извините, мне нужно изменить эти модели. PurchaseOrder должен действительно иметь экземпляр «how_many_products», а затем Product должен быть продуктом и price_for_each_item – Mdjon26

+0

Итак, продукт состоит из нескольких элементов? – MikkoP

ответ

1

Перемещение сверху.

Если я правильно понимаю, вы можете просто получить сумму из самого объекта. Так что если у вас есть ордер, называемый «порядок», где продукты уже назначены (во время процесса сохранения, вы должны быть в состоянии что-то вроде:

order.total_price = order.number_of_products.all().aggregate(Sum('price_for_each_item')). 

Позвольте мне знать, если это отвечает на ваш вопрос, и я буду двигаться .. это ответ

Рад, что смог помочь не быть нацистом здесь, пожалуйста, больше думать о ваших именах модели поля в будущем, они серьезно запутанный

Edit повторно комментарий:.

Я не уверен, но я думаю, что переопределение вашей модели Сохраним метод был бы путь, чтобы заставить его работать в админ:

def save(self): 
     super(Person, self).save() 
     self.total_price = self.number_of_products.all().aggregate(Sum('price_for_each_item')). 
     self.save(commit=True) 

Не проверял это на всех, хотя. Посмотрите на это: http://ifacethoughts.net/2009/07/14/calculated-fields-in-django/ Если это сработает, не могли бы вы принять ответ.

+0

Awesome. Если бы я должен был указать это в администраторе django, я бы сделал это определение, а затем вызвал его в list_display? Например, будет ли это что-то вроде def get_total price (self): order.total_price = order.number_of_products.all(). aggregate (Sum ('price_for_each_item')) – Mdjon26

+0

Отредактировал мой ответ. – MikkoP

+0

Я попытался поместить функцию сохранения def в класс PurchaseOrderAdmin и/или класс PurchaseOrder, и оба раза я получил ошибку «PurchaseOrderAdmin.list_display [1],« get_total_price »не является вызываемым или атрибутом« PurchaseOrderAdmin »или не найден в модель «PurchaseOrder». « – Mdjon26

1

Нет необходимости добавлять dollar_amount поля, то есть дублировать информацию. Вместо этого сделайте это свойство, вот как вы получите общую стоимость:

from django.db.models import Sum 

p = PurchaseOrder.objects.filter(...) 
p.annotate(Sum("products__price_for_each_item") 
+0

Хммм, я все еще не очень хорошо знаком со свойствами.Как я могу отобразить это в list_display администратора? или я думаю, будет ли способ сделать это определение, чтобы я мог легко поместить его в свой список_дисплей? – Mdjon26

+1

Я думал об одном и том же, но на самом деле, если цена изменится позже, вы не хотите, чтобы сумма на заказ изменилась. – MikkoP

+0

хороший пункт @MikkoP – Kimvais