制作一个相当复杂的Django模型方法可以在admin中排序?

时间:2011-01-07 12:23:35

标签: django django-models django-admin

我有一个相当复杂的自定义Django模型方法。它在管理界面中可见,我现在也想在管理界面中对它进行排序。

我已根据推荐in this previous question添加了admin_order_field,但我并不完全明白我还需要做什么。

class Book(models.Model):
    id = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=200)
    library_id = models.CharField(max_length=200, unique=True)
    def current_owner(self):
        latest_transaction = Transaction.objects.filter(book=self)[:1]
        if latest_transaction:
            if latest_transaction[0].transaction_type==0:
                return latest_transaction[0].user.windows_id
        return None
    current_owner.admin_order_field = 'current_owner'

目前,当我点击管理界面中的current_owner字段时,Django会给我

FieldError at /admin/books/book/
Cannot resolve keyword 'current_owner' into field

我是否还需要制作BookManager?如果是这样,我应该使用什么代码?这不像上一个问题中的示例那样简单,所以请帮助:)

谢谢!

2 个答案:

答案 0 :(得分:2)

Django管理员不会通过方法或任何其他非属性模型属性(即数据库列)的结果来排序模型。必须在数据库查询中完成排序,以保持简单和高效。

admin_order_field的目的是将非字段属性的排序等同于字段的排序。

例如,有效值current_owner.admin_order_field可以是idtitlelibrary_id。显然,这些都不适合你的目的。

一种解决方案是反规范化并始终将current_owner存储为Book上的模型字段;这可以使用信号自动完成。

答案 1 :(得分:1)

你不能这样做。 admin_order_field必须是一个字段,而不是一个方法 - 它的意思是当你有一个方法返回一个基础字段的自定义表示时,而不是当你做动态计算来提供值时。 Django的管理员使用ORM进行排序,而不能对自定义方法进行排序。