如何在 Django 管理页面中对模型方法字段(而不是模型字段)进行排序

3
我在这个网站上跟着一些问题添加了一个基于模型方法的新列到Django admin中。它非常好用。然而,我无法对该列进行排序。是否有办法对没有物理模型字段引用的模型方法字段进行排序?
例如,一个方法查找到另一个模型的外键关系,并返回字符串。它们可以按字母顺序排序。另一个示例是检查模型是否处于活动状态,基于是否存在终止日期。(显然,我可以轻松地向模型添加一个布尔字段,但我想知道是否可以仅使用方法来完成此操作)。是否有方法可以启用这些“列”的排序?
更新:这是一个non-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对象进行排序吗? - yuvi
1个回答

2
管理员使用数据库对结果进行排序,因此如果您的方法无法直接映射到数据库字段(如您的示例中所示的admin_order_field),则无法对其进行排序。话虽如此,您的get_username方法并不必要 - 它可以被外键查找替换。从1.3开始(我想是这样),您可以在管理设置中使用标准的__字段引用,例如:
list_display = ('is_active', 'user__username')

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


抱歉,我忘了提到我正在使用非关系型后端(mongo),所以外键查找不起作用。这就是为什么我需要使用get_username方法的原因。但您很确定在模型方法上进行排序并不太可能? - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接