Как объединить результат трех запросов в один, сохранив порядок, заданный 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

Мне нужно, чтобы результат запроса передавался в пагинатор.

Спасибо

Вернуться на верх