Как отсортировать список объектов разных классов по дате Django?
Мне нужно получить список всех транзакций и вывести их по дате. Для меня проблема то, что в списке не все объекты одного класса. Подскажите, как это решить.
Классы:
class Transaction(models.Model):
amount = models.PositiveIntegerField()
date = models.DateField()
commentary = models.TextField(blank=True)
class Meta:
abstract = True
class IncomeTransaction(Transaction):
income_category = models.ForeignKey(IncomeCategory, on_delete=models.PROTECT)
account = models.ForeignKey(Account, on_delete=models.PROTECT)
class ExpenseTransaction(Transaction):
account = models.ForeignKey(Account, on_delete=models.PROTECT)
expense_category = models.ForeignKey(ExpenseCategory, on_delete=models.PROTECT)
class InnerTransaction(Transaction):
account_from = models.ForeignKey(Account, on_delete=models.PROTECT, related_name='inner_transaction_from_set')
account_to = models.ForeignKey(Account, on_delete=models.PROTECT, related_name='inner_transaction_to_set')
В views.py такой код:
def history(request):
url_name = request.resolver_match.url_name
incomeT = IncomeTransaction.objects.all()
expenseT = ExpenseTransaction.objects.all()
innerT = InnerTransaction.objects.all()
transactions=[incomeT, expenseT, innerT]
return render(request, 'core/history.html', {'url_name': url_name, 'incomeT': incomeT, 'expenseT': expenseT, 'innerT': innerT, 'transactions': transactions})
Ответы (2 шт):
Ответ:
transactions = sorted((chain(incomeT, expenseT, innerT)), key=attrgetter('date'))
Вообще тут на мой взгляд два варианта.
- получить все объекты и отсортировать из средствами питона.
- Написать отдельный sql запрос, который формирует выборку в нужном тебе порядке.
Плюсы первого случая - просто работаешь в рамках ORM и не паришься о том, что бы дополнительно как-то работать с SQL. ПО крайней мере на один запрос меньше чем в случае с отдельным SQL запросом. Минусы - сложней организовать разбиение на страницы, так как общую сортировку ты узнаешь уже после того как получил все данные с БД. В этом случае придется получать избыточные данные, которые нивелируют отсутствие лишнего запроса sql.
Если нужно просто вывести эти данные скопом на страницу, вполне подойдет первый вариант, если планируется как-то дополнительно фильтровать , сортировать по страницам, то я бы склонялся в сторону дополнительного sql Запроса.