AttributeError: у объекта «CombinedExpression» нет атрибута «default_alias» - PullRequest
1 голос
/ 24 мая 2019

Когда я пытался вычесть два разных столбца, я получил эту ошибку:

>>> Product.objects.annotate(Sum('producttransactiondetails__purchase_quantity') - Sum('producttransactiondetails__sales_quantity'))
Traceback (most recent call last):
  File "/usr/lib/python3.6/code.py", line 91, in runcode
    exec(code, self.locals)
  File "<console>", line 1, in <module>
  File "/home/....env/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/.....env/lib/python3.6/site-packages/django/db/models/query.py", line 1032, in annotate
    if arg.default_alias in kwargs:
AttributeError: 'CombinedExpression' object has no attribute 'default_alias'

вот модели:

class ProductTransactionDetails(models.Model):
    product = models.ForeignKey(Product, on_delete=models.PROTECT)
    product_purchase = models.ForeignKey(ProductTransaction, on_delete=models.PROTECT)
    purchase_quantity = models.PositiveIntegerField(default=0)
    sales_quantity = models.PositiveIntegerField(default=0)
    discount = models.DecimalField(max_digits=20, decimal_places=2)
    product_price = models.DecimalField(max_digits=20, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Product(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    name = models.CharField(max_length=1000, db_index=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

1 Ответ

3 голосов
/ 24 мая 2019

Вы не присвоили имя столбца вашему комбинированному выражению.

Результатом предложения annotate() является QuerySet;этот QuerySet может быть изменен с помощью любой другой операции QuerySet.Таким образом, каждое значение должно быть в столбце, а каждому столбцу нужно имя (которое вы забыли добавить)

Do

Product.objects.annotate(in_stock_quantity=Sum('producttransactiondetails__purchase_quantity') - Sum('producttransactiondetails__sales_quantity'))

Помните здесь in_stock_quantity=

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...