首页 > 解决方案 > 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

标签: djangoannotatedjango-select-related

解决方案


您尝试将整数字段与小数字段相乘。因此,它会发生错误。你可以试试这个

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 包装表达式


推荐阅读