我正在尝试按对象的相关外键集中的特定值对Django Admin列表页面进行排序。
具体来说,在下面的代码中,我希望ContentAdmin视图显示按“Twitter Score”(名称为“Twitter”的Score对象)排序的所有内容对象的列表。
在django应用程序中,我有以下模型:
class Content(models.Model):
body = models.CharField(max_length=564)
title = models.CharField(max_length=64)
class Score(models.Model):
name = models.CharField(max_length=64)
score = models.IntegerField()
content = models.ForeignKey('Content')
在admin.py中我有以下内容:
class ContentAdmin(admin.ModelAdmin):
list_display = ('title', 'show_twitter_score',)
def show_twitter_score(self, obj):
twitter_score = obj.score_set.get(name='Twitter')
return 'Twitter: ' + str(twitter_score.score)
目标:ContentAdmin的管理面板显示按“Twitter”分数排序的内容对象
谢谢大家!
答案 0 :(得分:5)
我通过扩展get_queryset
类的ContentAdmin
方法解决了这个问题。在那之后,只需要获得正确的ORM查询
def get_queryset(self, request):
qs = super(ContentAdmin, self).get_queryset(request)
return qs.filter(score__name='Twitter').order_by('-score__score')
对于Django 1.5及更早版本,该方法为queryset
。
def queryset(self, request):
qs = super(ContentAdmin, self).queryset(request)
return qs.filter(score__name='Twitter').order_by('-score__score')
答案 1 :(得分:0)
如果我理解正确,你可以在Django的文档中从ModelAdmin.list_display试试这个:
通常,
list_display
的非实际数据库字段的元素不能用于排序(因为Django在数据库级别进行所有排序)。但是,如果
list_display
的元素代表某个数据库字段,您可以通过设置该项的admin_order_field
属性来指明这一事实。例如:
class Person(models.Model): first_name = models.CharField(max_length=50) color_code = models.CharField(max_length=6) def colored_first_name(self): return '<span style="color: #%s;">%s</span>' % (self.color_code, self.first_name) colored_first_name.allow_tags = True colored_first_name.admin_order_field = 'first_name' class PersonAdmin(admin.ModelAdmin): list_display = ('first_name', 'colored_first_name')
当尝试按照管理员中的colored_first_name排序时,上面将告诉Django按first_name字段排序。
您可以在代码中尝试使用此解决方法进行排序。
答案 2 :(得分:0)
由于django admin使用数据库进行排序,因此无法对列表中显示的功能进行排序。
您可以做的是将要显示的列添加到django管理员用于列出模型的查询集中,这样您就可以进行排序。
要添加列,您需要使用queryset extra方法。
这应该可以解决问题:)
Content.objects.all().extra(select={'twitter_score': 'SELECT score from content_score WHERE content_score.id = content_content.id'})
BONUS ROUND:
Content.objects.all()。extra(select = {'twitter_score':'SELECT'Twitter得分:'||得分来自content_score WHERE content_score.id = content_content.id'})