@lehubozedo

Как одним запросом вытащить суммарную цену вот из этого «self.gifts.all()»?

Есть три модели, у каждой есть поле price
class Tomato(models.Model):
    price=...
class Potatoes(models.Model):
    price=...
class Eggplant(models.Model):
    price=...


И есть 4ая модель:
class Vegetable(models.Model):
    tomato = models.OneToOneField(Tomato, verbose_name='Томат', on_delete=models.CASCADE, blank=True, null=True)
    potatoes = models.OneToOneField(Potatoes, verbose_name='Potatoes', on_delete=models.CASCADE, blank=True, null=True)
    eggplant = models.OneToOneField(Eggplant, verbose_name='Eggplant', on_delete=models.CASCADE, blank=True, null=True)
    gifts = models.ManyToManyField('self', blank=True, symmetrical=False)


Как одним запросом вытащить суммарную цену вот из этого (self это Vegetable) "self.gifts.all()" ?
Проблема в том, что ЛЮБОЙ экземпляр vegetable, должен и содержит только что то одно:
print vegetable.tomato, vegetable.potatoes, vegetable.eggplant
.... "Tomato-delicious", none, none


gifts понятное дело, содержит ссылки на несколько экземпляров Vegetable, как вытащить сумму price этих экземпляров?
  • Вопрос задан
  • 168 просмотров
Пригласить эксперта
Ответы на вопрос 1
Вот так можно. Только погуглите в сторону select и prefetch_related для self.gifts.all()
class Vegetable(models.Model):
    tomato = models.OneToOneField(Tomato, verbose_name='Томат', on_delete=models.CASCADE, blank=True, null=True)
    potatoes = models.OneToOneField(Potato, verbose_name='Potatoes', on_delete=models.CASCADE, blank=True, null=True)
    eggplant = models.OneToOneField(Eggplant, verbose_name='Eggplant', on_delete=models.CASCADE, blank=True, null=True)
    gifts = models.ManyToManyField('self', blank=True, symmetrical=False)

    @property
    def get_price(self):
        tomato = self.tomato.price if self.tomato is not None else 0
        potatoes = self.potatoes.price if self.potatoes is not None else 0
        eggplant = self.eggplant.price if self.eggplant is not None else 0
        return sum([tomato, potatoes, eggplant])
        
    @property   
    def get_gift_price(self):
        return sum([x.get_price for x in self.gifts.all()])
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы