Django:按字典添加值排序查询集

时间:2019-03-23 17:38:43

标签: django django-queryset

我正在尝试对添加了一些计算值的字典查询集进行排序。

过程:

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.

我的问题与语句的“何时用作迭代”部分有关吗?如何通过附加值对这种查询集进行排序?

谢谢!

1 个答案:

答案 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)