首页 > 解决方案 > Django admin 自定义降序和升序字段

问题描述

我正在使用 Django Admin 来可视化和编辑我的模型的数据。模型的字段之一是日期,不幸的是,它是一个 CharField,但带有一个验证器 (dd.mm.yyyy)。当管理员按下 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'
                   )])

按钮

标签: pythondjangodjango-modelsdjango-admindjango-admin-filters

解决方案


我设法通过使用数据库函数的注释和组合来添加 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

这仅适用于使用 dd.mm.yyyy 或 dmyyyy 等格式的日期以及它们的任何组合。

随意回复此方法的更好解决方案或改进。


推荐阅读