我有一个相当复杂的自定义 Django 模型方法。它在管理界面中可见,我现在也想让它在管理界面中排序。
我已添加 admin_order_field
如推荐 in this previous question ,但我不完全明白我还需要做什么。
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 吗?如果是这样,我应该使用什么代码?这不像上一个问题中的示例那样简单 Count,因此将不胜感激 :)
谢谢!
最佳答案
Django 管理员不会根据方法或任何其他不是模型字段(即数据库列)的属性的结果对模型进行排序。排序必须在数据库查询中完成,以保持简单和高效。admin_order_field
的目的是将非字段属性的排序等同于作为字段的事物的排序。
例如,有效值 current_owner.admin_order_field
可能是 id
, title
或 library_id
.显然,这些都对您的目的没有意义。
一种解决方案是非规范化并始终存储 current_owner
作为 Book
上的模型字段;这可以使用信号自动完成。
关于django - 使相当复杂的 Django 模型方法可在管理员中排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625414/