Как заказать 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')
Это решение должно работать для вашего примера, но, конечно, потребуются некоторые корректировки в случае, если замены начнут конфликтовать друг с другом (например, если одно из ваших исходных значений статуса содержит цифру).