Skip to main content
 首页 » 编程设计

python之如何在模型方法字段(不是模型字段)上对 Django 管理列进行排序

2024年11月01日32jirigala

我按照本网站上的一些问题在基于模型方法的 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' 

请您参考如下方法:

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

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

list_display = ('is_active', 'user__username') 

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