python - 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'
)])
解决方案
我设法通过使用数据库函数的注释和组合来添加 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 等格式的日期以及它们的任何组合。
随意回复此方法的更好解决方案或改进。
推荐阅读
- javascript - Twitter Bootstrap - 放置一个大的 Popover 以覆盖屏幕的中心
- open-policy-agent - 是否可以在开放策略代理策略中使用外部程序的输出
- java - 如何用 PDActionJavaScript 替换 PDAnnotationLink 的默认操作?
- python - 如何在 Pyspark 中编写 for 循环或情节
- java - 如何重新排列一个整数,以便将其重新排列为 Java 中的最高可能值?
- delphi - 无法在 Delphi 中更改 TEdit 文本
- python - create_user() 缺少 1 个必需的位置参数:“用户名”
- wso2 - WSO2 中的 API 管理规则
- java - springboot mongo 如果图像不存在使用现有的
- arduino-c++ - TinkerCAD Ardunio 代码错误,参数太少