Django Admin:按相关外键的价值排序

时间:2012-04-19 19:05:03

标签: python django django-admin

我正在尝试按对象的相关外键集中的特定值对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”分数排序的内容对象

谢谢大家!

3 个答案:

答案 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'})

相关问题