Django аннотировать в поле select_related - PullRequest
0 голосов
/ 27 февраля 2019

Мои упрощенные модели:

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') возвращает ошибку

Невозможно разрешить ключевое слово 'value' в поле.Возможные варианты: cart_id, id, product, product_id, qnt

1 Ответ

0 голосов
/ 27 февраля 2019

Вы пытаетесь умножить целочисленное поле на десятичное поле.Итак, возникает ошибка.Вы можете попробовать это

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

...