我想为django管理中的自定义模型字段提供排序功能。
代码类似于
class MyModel(models.Model):
first_name = models.CharField()
last_name = models.CharField()
def most_recent_mailing_date(self):
""" Return the most recent mailing date """
mailingHistories = self.mailinghistory_set.all()
if len(mailingHistories) != 0:
today = datetime.date.today()
mostRecentHistory = None
diff = -1
for mailingHistory in mailingHistories:
if mailingHistory.mailing_date < today and (diff == -1 or (today - mailingHistory.mailing_date) < diff):
mostRecentHistory = mailingHistory
diff = today - mostRecentHistory.mailing_date
if mostRecentHistory is None:
return "No Mailing History"
else:
return mostRecentHistory.mailing_date
else:
return "No Mailing History"
most_recent_mailing_date.admin_order_field = 'self.most_recent_mailing_date'我想订购的字段是most_recent_mailing_date。这是一个自定义字段。有可能吗?
提前感谢!
发布于 2014-04-25 01:11:02
我觉得这不可能。来自文档
您有四个可能的值可以在list_display中使用: …… 表示模型上的属性的字符串。这几乎与可调用的行为相同,但在此上下文中的self是模型实例。下面是一个完整的模型示例:
from django.db import models from django.contrib import admin
class Person(models.Model):
name = models.CharField(max_length=50)
birthday = models.DateField()
def decade_born_in(self):
return self.birthday.strftime('%Y')[:3] + "0's"
decade_born_in.short_description = 'Birth decade'
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'decade_born_in')因此,您的字段是第四个选项。然而:
有几个关于list_display的特殊情况需要注意: ..。 通常,不属于实际数据库字段的list_display元素不能用于排序(因为Django在数据库级别执行所有排序)。 .(接着描述不适用于这里的异常)。
因此,您只能对实际的数据库字段进行排序。
发布于 2014-04-25 01:10:54
您不能使用Django的order_by,因为它是在数据库级别应用的。数据库不知道任何关于python方法和属性的信息。
但是,您可以在Python中进行排序。
objects = MyModel.objects.all()
sorted(objects, key=lambda k: k.most_recent_mailing_date())如果你想要倒序,
objects = MyModel.objects.all()
sorted(objects, key=lambda k: k.most_recent_mailing_date(), reverse=True)咨询
instance.most_recent_mailing_date。这将使它在某种程度上与引用实际模型字段的方式一致。https://stackoverflow.com/questions/23282383
复制相似问题