我有一个相当复杂的自定义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?如果是这样,我应该使用什么代码?这不像上一个问题中的示例那样简单,所以请帮助:)
谢谢!
答案 0 :(得分:2)
Django管理员不会通过方法或任何其他非属性模型属性(即数据库列)的结果来排序模型。必须在数据库查询中完成排序,以保持简单和高效。
admin_order_field
的目的是将非字段属性的排序等同于字段的排序。
例如,有效值current_owner.admin_order_field
可以是id
,title
或library_id
。显然,这些都不适合你的目的。
一种解决方案是反规范化并始终将current_owner
存储为Book
上的模型字段;这可以使用信号自动完成。
答案 1 :(得分:1)
你不能这样做。 admin_order_field
必须是一个字段,而不是一个方法 - 它的意思是当你有一个方法返回一个基础字段的自定义表示时,而不是当你做动态计算来提供值时。 Django的管理员使用ORM进行排序,而不能对自定义方法进行排序。