Django аннотировать в поле select_related
Мои упрощенные модели:
class Product(models.Model):
name = models.CharField()
class Price(models.Model):
product = models.OneToOneField('Product', primary_key=True)
value = models.DecimalField()
class Cart(models.Model):
product = models.ForeignKey('Product')
qnt = models.IntegerField()
Мне нужно умножение двух полей хранятся в другом поле, а именно sum
, Почему Cart.objects.select_related('product__price').annotate(sum=F('product__price__value') * F('qnt'))
ничего не возвращает?
Замена F('')
в F('value')
возвращает ошибку
Не удается разрешить ключевое слово "значение" в поле. Возможные варианты: cart_id, id, product, product_id, qnt
1 ответ
Решение
Вы пытаетесь умножить целочисленное поле на десятичное поле. Итак, возникает ошибка. Вы можете попробовать это
from django.db.models import ExpressionWrapper, F, DecimalField
Cart.objects.select_related('product__price').annotate(
sum= ExpressionWrapper(
F('product__price__value') * F('qnt'), output_field=DecimalField()))
Если поля, которые вы комбинируете, имеют разные типы, вам нужно указать Django, какой тип полей будет возвращен. Поскольку F() напрямую не поддерживает output_field, вам нужно обернуть выражение с помощью ExpressionWrapper