通过模型中的方法对Django模型进行排序

时间:2012-06-11 14:42:20

标签: python django django-admin

所以,说我有这样的模型:

class Foo(Model):
    name = CharField(max_length=200)
    def latest_comment(self):
        try:
            object = self.comment_set.latest()
            if object:
                return object.when_posted.date()
        except:
            return ""

class Comment(Model):
   when_posted = DateTimeField()
   text = TextField()

然后这是modelAdmin:

class FooAdmin(ModelAdmin):
    list_display = ['name', 'latest_comment']
    ordering = ['latest_comment']

admin.site.register(Foo, FooAdmin)

当我访问管理网站时说在app.Foo中找不到'latest_comment'时会抛出错误。在list_display中使用它可以正常工作。所以,我的问题是:有没有办法通过模型的方法在list_display中订购模型?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:3)

我还没有测试过代码,但是尝试通过覆盖ModelAdmin的查询集并使用注释函数对相关字段中的字段进行排序来尝试实现此代码:

class FooAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(FooAdmin, self).queryset(request)

        return qs.distinct() \
        .annotate(date_of_last_comment=Max('comment__date')) \
        .order_by('-date_of_last_comment')

答案 1 :(得分:1)

Ordering是一个SQL级功能,您的数据库对模型上的方法一无所知。

但是,您可以通过将查询集转换为列表然后使用sorted之类的内容来重新排序。请参阅:http://wiki.python.org/moin/HowTo/Sorting/

虽然它值得,但我怀疑排序列表是否适用于管理员。我可能是错的,但我很确定Django需要它来保持查询集。

答案 2 :(得分:0)

django doc开始,您可以定义自己的get_ordering方法。