django - 使相当复杂的 Django 模型方法可在管理员中排序?

标签 django django-models django-admin

我有一个相当复杂的自定义 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 , titlelibrary_id .显然,这些都对您的目的没有意义。

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

关于django - 使相当复杂的 Django 模型方法可在管理员中排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625414/

相关文章:

python - 动态 ChoiceField 无法在表单中进行验证

Django:尽管实例在查询集中,但 assertIn(instance, queryset) 失败

使用自定义模型注册后Django无法登录

django-admin - django admin list_display 反转(不是) bool 字段

python - Google App Engine 中的 Django 自定义模板标签

django - 从 python-social-auth 后端获取 DRF token

python - 在 Django Admin 中添加 map

python - Django 模型实例是否可哈希?

python - Django - 如何在管理页面字段上显示科学记数法?

grails - Grails管理员(类似于Django的)