Как объединить результат трех запросов в один, сохранив порядок, заданный order by в Django
Я пытаюсь получить список из модели, чтобы показать результаты, упорядоченные по статусу, например: сначала "активный", затем "в процессе" и "не активный" в нижней части списка. При этом результаты для каждого статуса должны быть упорядочены по дате.
Я использую Django версии 4.0 и базу данных MySQL.
Я попытался реализовать это с помощью Union, но результаты упорядочиваются неправильно.
Вот код модели:
class LegalDocument(CreateAndUpdateDatesModel):
class DocumentStatus(models.TextChoices):
ACTIVE = 'Activo', 'Activo'
EXPIRED = 'Vencido', 'Vencido'
EVALUATING = 'Evaluación', 'Evaluación'
REJECTED = 'Rescindido', 'Rescindido'
RESOLVED = 'Resuelto', 'Resuelto'
class DocumentType(models.TextChoices):
CONTRACT = 'Contrato', 'Contrato'
AGREEMENT = 'Convenio', 'Convenio'
MEMORANDUM = 'Memorándum', 'Memorándum'
ADDENDUM = 'Enmienda', 'Enmienda'
LETTER = 'Carta', 'Carta'
OTHER = 'Otro', 'Otro'
document_number = models.CharField(max_length=100, unique=True)
title = models.CharField(max_length=100)
description = RichTextUploadingField()
status = models.CharField(max_length=100, choices=DocumentStatus.choices, default=DocumentStatus.ACTIVE)
expiration_date = models.DateField(null=True, blank=True)
А вот как я выполняю запрос с объединением:
legal_documents = LegalDocument.objects.all()
active_documents = legal_documents.filter(status=LegalDocument.DocumentStatus.ACTIVE).order_by('expiration_date')
evaluating_document = legal_documents.filter(status=LegalDocument.DocumentStatus.EVALUATING).order_by('expiration_date')
expired_documents = legal_documents.filter(status=LegalDocument.DocumentStatus.EXPIRED).order_by('expiration_date')
rejected_documents = legal_documents.filter(status=LegalDocument.DocumentStatus.REJECTED).order_by('expiration_date')
resolved_documents = legal_documents.filter(status=LegalDocument.DocumentStatus.RESOLVED).order_by('expiration_date')
legal_documents = active_documents.union(evaluating_document, expired_documents, rejected_documents, resolved_documents, all=True)
Результат, который я получаю, пожалуйста, обратите внимание на столбец "Дата истечения срока действия" (даты в формате %Y-%m-%d):
Title | Status | Expiration Date |
---|---|---|
Document1 | Activo | 2024-10-13 |
Document2 | Activo | 2024-09-20 |
Document3 | Vencido | 2024-09-20 |
Document4 | Vencido | 2024-08-01 |
Document5 | Rescindido | 2024-08-11 |
Мне нужно, чтобы запрос возвращал правильный порядок дат внутри каждого статуса, например:
Title | Status | Expiration Date |
---|---|---|
Document2 | Activo | 2024-09-20 |
Document1 | Activo | 2024-10-13 |
Document4 | Vencido | 2024-08-01 |
Document3 | Vencido | 2024-09-20 |
Document5 | Rescindido | 2024-08-11 |
Мне нужно, чтобы результат запроса передавался в пагинатор.
Спасибо