Добавление двух полей из двух разных модулей django module - PullRequest
0 голосов
/ 05 ноября 2019

Я создаю приложение для управления запасами, в которое я хотел бы добавить поле класса quantity (значение) с полем quantity_prod из модуля ProductionArticle. Результат этой операции должен заполнить другое поле quantity_in_stock в классе Article.

Я пробовал аннотацию с выражением F и метод сохранения с переопределением с article_set, но я не нашел хорошего результатаМне интересно, есть ли прямой метод для математической операции между полями без использования сложного метода

class Article(models.Model):
    code = models.CharField(max_length=20, blank=False, default='0216')
    designation = models.CharField(max_length=200, blank=False)
    unit = models.CharField(max_length=10, choices=choices_unite, default='')
    quantity = models.FloatField(default=0)
    quantity_in_stock = models.FloatField(default=0)


    def __str__(self):
        return self.designation

class ProductionArticle(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    planned quantity = models.FloatField(default=0)
    production date = models.DateTimeField(default=timezone.now, verbose_name="Date d'ajout")
    unit = models.CharField(max_length=10, choices=choices_unite, default='')
    operator = models.CharField(max_length=200, default='Ahmed')
    quantity_prod  = models.FloatField(defaut=0)

1 Ответ

0 голосов
/ 05 ноября 2019

Я не думаю, что F здесь уместно. Потому что объект Article может иметь несколько ProductionArticle. Вместо этого используйте Sum:

from django.db.models import Sum

articles = Article.objects.annotate(prod_quantity=Sum('productarticle__quantity_prod')).annotate(quantity_in_stock=F('prod_quantity')+F('quantity'))

for a in articles:
   print(a.quantity_in_stock)

Альтернативой вышеприведенному решению является использование метода свойств. Но это не рекомендуется, потому что это увеличит количество обращений к БД:

from django.db.models import Sum
from django.db.models.functions import Coalesce

class Article(models.Model):
    ...
    @property
    def quantity_in_stock(self):
        return self.productionarticle_set.all().aggregate(qsum=Coalesce(Sum('quantity_prod'), 0))['qsum'] + self.quantity
...