django在select_related字段上注释

时间:2019-02-27 12:40:41

标签: django annotate 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 个答案:

答案 0 :(得分: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包装表达式