Как заказать choicefiled в модели django

У меня есть файл выбора, и мне нужно отсортировать его на основе порядка в кортеже CHOICES и в этом model.py :

class MeetingMember(models.Model):
    CHOICES = (
    ("H", "Host"),
    ("A", "Accepted"),
    ("R", "Rejected"),
    ("I", "Invited" )
    )
    
    status = models.CharField(max_length=9, choices=CHOICES, default="I")

я уже пробовал мета заказывать :

    class Meta:
    
        ordering = ('status',)

но это не работает, мне нужно сортировать их в 'Host,Accepted,Rejected,Invited'

Вы можете попытаться использовать функцию Replace (https://docs.djangoproject.com/en/3.2/ref/models/database-functions/#replace). Стратегия заключается в аннотировании нового поля со значением, построенным таким образом, чтобы его алфавитный порядок соответствовал пользовательскому порядку, который вы хотите видеть в исходном поле:

from django.db.models import F, Value
from django.db.models.functions import Replace

# This generates a dictionary like {'0': 'H', '1': 'A', ...}
mapped_choices = {str(n): CHOICES[n][0] for n in range(len(CHOICES))}

# For each mapped choice we create a replacer
replacers = [
    Replace('status_for_ordering', Value(original), Value(replacement)) 
    for replacement, original in mapped_choices.items()
]

qs = MeetingMember.objects.all().annotate(status_for_ordering=F('status'))
for replacer in replacers:
    qs = qs.annotate(status_for_ordering=replacer)

# Of course here you can still filter or do other operations before ordering
qs = qs.order_by('status_for_ordering')

Это решение должно работать для вашего примера, но, конечно, потребуются некоторые корректировки в случае, если замены начнут конфликтовать друг с другом (например, если одно из ваших исходных значений статуса содержит цифру).

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