Настраиваемые нисходящие и восходящие поля администратора Django

#python #django #django-models #django-admin #django-admin-filters

#python #django #django-модели #django-admin #django-администратор-фильтры #django-admin-filters

Вопрос:

Я использую Django Admin для визуализации и редактирования данных моей модели. Одним из полей модели является дата, и, к сожалению, это символьное поле, но с валидатором ( дд.мм.гггг ). Я пытаюсь найти решение для правильной сортировки этих дат, когда администратор нажимает кнопку сортировки, которая используется по умолчанию в django. По моему опыту работы с Java все сводилось к перезаписи функции сравнения класса.

 data_de_montat = models.CharField(help_text="eg: 02.07.2020 or 12.9.2021", max_length=15, validators=[
    RegexValidator(r'^[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$',
                   message='It should be dd.ll.aaaa',
                   code='wrong format'
                   )])
  

кнопка

Ответ №1:

В django это очень просто. Вам нужно только зайти в admin.py создайте класс с именем вашей модели, а затем добавьте фильтр по дате создания, который автоматически сортирует все даты для вас. Пример:

Шаг 1: Перейдите к admin.py вашего приложения

Шаг 2: Добавьте следующий код

 class YourModelAdmin(admin.ModelAdmin):
list_filter=['data_de_montat']
  

Комментарии:

1. Это не совсем то, что я хочу, дело не в настройке, а в порядке их воспроизведения.

Ответ №2:

Мне удалось решить эту проблему, добавив еще 3 вычисляемых поля, используя аннотацию и комбинации функций базы данных для форматирования моих данных. Это не то решение, о котором я мечтал, но я справился с этим определенным образом. Этот код поставляется в модели администратора.

     def get_queryset(self, request):
        qs = super(ProgramareAdmin, self).get_queryset(request)
        qs = qs.annotate(day=Cast(str("data_de_montat").split(".")[0], output_field=IntegerField()),
                         month=Cast(Substr("data_de_montat", StrIndex("data_de_montat", V('.'))   1),
                                   output_field=IntegerField()),
                         year=Cast(Right("data_de_montat", 4), output_field=IntegerField()))
        return qs

    def day(self, obj):
        return obj.day

    def month(self, obj):
        return obj.month

    def year(self, obj):
        return obj.year

    day.admin_order_field = 'day'  # sortable new column
    month.admin_order_field = 'month'  # sortable new column
    year.admin_order_field = 'year'  # sortable new column
  

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

Не стесняйтесь отвечать лучшим решением или улучшениями для этого метода.