Вычисляемое поле на основе метода внутри модели Джанго - PullRequest
1 голос
/ 14 мая 2019

Как автоматически заполнить поле в моей модели PurchaseOrder:

class PurchasedOrder(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField()


    @property
    def batch_cost(self):
        return self.quantity * self.product.unit_price

    def __str__(self):
        return self.product.name

Если я определю его как свойство, я не смогу использовать это свойство для фильтрации и заполнения.Я хочу, чтобы это было вычисляемое поле.

Я попробовал следующее, но это не сработало:

def calculate_batch_cost(self):
    return self.quantity * self.product.unit_price

batch_cost = models.FloatField(default=calculate_batch_cost)

Буду признателен за вашу помощь <3 </p>

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Если это поле необходимо указывать и изменять каждый раз, когда объект создается или обновляется, вы можете добавить его в функцию сохранения:

def save(self, *args, **kwargs):
    self.batch_cost = self.calculate_batch_cost()
    super(PurchasedOrder, self).save(*args, **kwargs)

И, конечно, вам нужно добавить поле внутримодель

batch_cost = models.FloatField()

Тогда вы все еще можете использовать свою функцию calculate_batch_cost в другом месте своего кода.

1 голос
/ 14 мая 2019

Вы можете .annotate(..) [Django-doc] в QuerySet, например:

from django.db.models import F

PurchasedOrder.objects.annotate(
    <b>batch_cost=F('product__unit_price') * F('quantity')</b>
).filter(
    batch_cost__gt=100  # An example of filtering
)

PurchasedOrder s из этого набора запросов будет иметь атрибут .batch_cost, который является unit_price продукта, умноженным на quantity.

Затем мы можем, например, отфильтровать по этому. Например, в приведенном выше запросе мы получим все PurchasedOrder с batch_cost, превышающим 100.

...