【问题标题】:How to sort Django admin column on a model method field (not a Model Field)如何在模型方法字段(不是模型字段)上对 Django 管理列进行排序
【发布时间】:2014-02-16 02:55:54
【问题描述】:

我按照这个网站上的一些问题在 Django 管理中添加了一个基于模型方法的新列。它工作得很好。但是,我无法按列排序。有没有办法在没有物理模型字段可引用的模型方法字段上完成排序?

例如,一种方法查找与另一个模型的外键关系并返回字符串。它们可以按字母顺序排序。另一个示例根据是否存在终止日期来检查模型是否处于活动状态。 (显然我可以很容易地在模型中添加一个boolean 字段,但我想知道这是否可以通过仅使用方法来完成)。有没有办法对这些“列”进行排序?

更新:这是一个非 rel 后端 (mongo),因此外键查找本身无法工作。

例如

class mymodel(models.Model):
    user = models.ForeignKey(User)
    termination_date = models.DateTimeField(blank=True, null=True)

    # Useful admin view methods
    # Returns whether the model is currently active.
    def is_active(self):
        if self.termination_date:
            return False
        else:
            return True

    is_active.boolean = True
    is_active.admin_order_field = 'termination_date' #<--- This activates sort, but not on the boolean, it sorts on the Model Field termination_date.

    # Returns the username from foreign key relationship
    def get_username(self):
        return User.objects.get(pk=self.user_id).username

    get_username.short_description = 'user'

【问题讨论】:

  • 你能做到MyModel.objects.all().order_by('user__username')吗?我的意思是,暂时忘记管理站点,您可以根据相关用户名使用非相关 ORM(不是 python)订购 QuerySet 对象吗?

标签: python django sorting django-admin django-mongodb-engine


【解决方案1】:

管理员使用数据库对结果进行排序,因此如果您的方法无法直接映射到数据库字段(如您的 admin_order_field 示例所示),则无法对其进行排序。

也就是说,您的 get_username 方法不是必需的 - 它可以替换为外键查找。从 1.3 开始(我认为)您可以在管理设置中使用标准的 __ 字段引用,例如:

list_display = ('is_active', 'user__username')

在这种情况下,该列将是可排序的,因为user__username 是一个数据库列。我相信,如果您需要对用户名执行更多操作而不仅仅是显示未编辑的用户名,您可以将 user__username 设置为您的方法的 admin_order_field

【讨论】:

  • 对不起,我忘了提到我使用的是非 rel 后端 (mongo),所以外键查找不起作用。这就是我需要使用get_username 方法的原因。但是你很确定对模型方法进行排序是不太可能的?
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多