Django: упорядочение набора запросов по значениям словаря - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь отсортировать набор словарей, к которым я добавил некоторые вычисляемые значения.

Процесс:

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 doc 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 Ответ

3 голосов
/ 23 марта 2019

Вы должны использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...