我在此网站上关注了一些问题,根据模型方法在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'
答案 0 :(得分:2)
管理员使用数据库对结果进行排序,因此如果您的方法无法直接映射到数据库字段(如admin_order_field
显示的示例所示),则无法对其进行排序。
也就是说,您的get_username
方法不是必需的 - 可以用外键查找替换它。从1.3(我认为)开始,您可以在管理设置中使用标准__
字段引用,例如:
list_display = ('is_active', 'user__username')
在这种情况下,该列将是可排序的,因为user__username
是一个数据库列。我相信,如果您需要对用户名执行更多操作而不是仅显示未经编辑的用户名,则可以将user__username
设置为您的方法的admin_order_field
。