我正在尝试对添加了一些计算值的字典查询集进行排序。
过程:
class Inventario(models.Model):
codigo_kinemed = models.CharField(max_length=100)
existencias = models.IntegerField(help_text="Existencias ", blank=True, null=True)
valor_coste = models.IntegerField(help_text="Existencias ", blank=True, null=True)
valor_venta = models.IntegerField(help_text="Existencias ", blank=True, null=True)
fecha = models.DateField(help_text="Fecha de toma de datos", blank=True, null=True)
def __str__(self):
return str(self.codigo_kinemed)
我从中得到一个查询集。
inventario_diferencia = Inventario.objects.filter(fecha=ultima_fecha_cargada.fecha).values()
返回字典查询集。然后,我遍历该查询集并计算一些新字段。
for este in inventario_diferencia:
este['stock_valor_venta'] = este['existencias'] * este['valor_venta']
我可以在模板中毫无问题地打印该计算字段。
{{ inventario_diferencia.stock_valor_venta }}
订购
我想通过添加的新stock_valor_venta
值对该查询集进行排序。
当我尝试通常的查询集
inventario_diferencia.order_by('stock_valor_venta')
我得到:
无法将关键字“ diferencia_mes”解析为字段。选项包括:codigo_kinemed,existencias,fecha,id,valor_coste,valor_venta
这些是模型的原始值,因此无法选择按新值排序。当我尝试像字典一样对它进行排序
inventario_diferencia = sorted(inventario_diferencia, key=lambda t: t.diferencia_mes)
我知道
'dict'对象没有属性'diferencia_mes'
文档
在Django文档https://docs.djangoproject.com/en/2.1/ref/models/querysets/#values中指出以下内容:
values(*fields, **expressions) Returns a QuerySet that returns dictionaries, rather than model instances, when used as an iterable.
我的问题与语句的“何时用作迭代”部分有关吗?如何通过附加值对这种查询集进行排序?
谢谢!
答案 0 :(得分:3)
您应该考虑使用annotate。您可以创建一个等于两个字段的乘积的字段,然后在SQL中按该字段排序。
from django.db.models import F
inventario_diferencia = Inventario.objects.filter(
fecha=ultima_fecha_cargada.fecha
).annotate(
stock_valor_venta=F('existencias') * F('valor_venta')
).order_by('-stock_valor_venta')
print(inventorio_deiferencia.first().stock_valor_venta)