7

所以,假设我有这样的模型:

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 中的模型进行排序?如果是这样,怎么办?

4

3 回答 3

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')
于 2012-06-11T21:12:33.820 回答
1

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

但是,您可以通过将查询集转换为列表然后使用类似sorted. 见:http ://wiki.python.org/moin/HowTo/Sorting/

不过,对于它的价值,我怀疑排序列表是否可以在管理员中使用。我可能是错的,但我很确定 Django 需要它来保持查询集。

于 2012-06-11T14:50:07.617 回答
0

django doc,您也许可以定义自己的get_ordering方法。

于 2012-06-11T14:50:38.993 回答