Объединить две записи из одной модели в django queryset - PullRequest
0 голосов
/ 21 февраля 2020

Я искал решение в сети пару часов, но ничего не подходит для того, что я ищу.

У меня есть одна модель (упрощенная):

class SimpleModel(Model):
    name = CharField('Name', unique=True)
    date = DateField()
    amount = FloatField()

I иметь две даты; date_one и date_two.

Я бы хотел один набор запросов со строкой для каждого имени в Модели, где каждая строка показывает:

{'name': name, 'date_one': date_one, 'date_two': date_two, 'amount_one': amount_one, 'amount_two': amount_two, 'change': amount_two - amount_one}

Причина, по которой я хотел бы иметь возможность чтобы найти ранг amount_one, amount_two и change, используя сортировку или фильтры для этого отдельного набора запросов.

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

но, возможно, я чувствую, что должно быть решение БД, использующее один набор запросов, который был бы быстрее.

union показалось многообещающим, но вы не может выполнить некоторые простые операции, такие как filter, после этого

Я думаю, что я мог бы, возможно, разделить имя на его собственную модель и создать набор запросов со связанными полями, но я бы предпочел не изменять схему на этом этапе. Кроме того, у меня есть доступ только к sqlite.

спасибо за любую помощь!

1 Ответ

1 голос
/ 21 февраля 2020

Ваша текущая модель заставляет вас иметь ОДНО имя, связанное с ОДНОЙ датой и ОДНОЙ суммой. Поскольку name - это unique=True, , вы буквально не можете иметь две даты, связанные с одним и тем же именем

Так что, если вы хотите иметь возможность иметь несколько дат / сумм, связанных с именем, Есть несколько способов продолжить

Идея 1: Если будет только 2 даты и 2 суммы, просто добавьте поле второй даты и поле второй суммы

Идея 2: Если может быть бесконечное количество дней и сумм, вам придется изменить свою модель, чтобы отразить ее, имея:

  • Модель для ваших имен
  • Модель для ваших дней и сумм с внешним ключом к вашим именам

Идея 3: Вы можете оставить ту же модель и просто удалить unique ограничение, но это рецепт для ошибок

Исходя из вашего выбора, у вас будет несколько способов запрашивать то, что вам нужно. Это зависит от вашей окончательной структуры модели. Наилучшим способом go было бы создание пользовательских методов модели, которые запрашивают 2 даты / суммы, форматируют массив и возвращают его

...