Django管理:整理值对相关的外键(Django Admin: Order by value on

2019-06-23 18:39发布

我试图通过在对象的相关外键设定一个特定值排序Django管理列表页面。

具体而言,在下面的代码,我想ContentAdmin视图来显示通过“推特分数”(名称为“推特”分数对象)排序的所有内容对象的列表。

在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管理显示板通过“推特”得分下令内容对象

感谢大家!

Answer 1:

我通过扩展解决了这个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')


Answer 2:

如果我理解正确的话,你可以试试这个ModelAdmin.list_display Django的文档:

通常,元素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') 

上面的代码将告诉Django由FIRST_NAME场试图通过在管理colored_first_name排序时订购。

你可以在你的排序代码尝试这种解决方法。



Answer 3:

由于Django管理使用DB你排序的功能着那种你是显示在列表中。

你可以做的是添加你要显示给Django管理使用,列出你的模型查询集列,这样你可以有排序。

要添加你需要,你必须使用查询集额外的方法列。

这应该做的伎俩:)

Content.objects.all().extra(select={'twitter_score': 'SELECT score from content_score WHERE content_score.id = content_content.id'})

奖金圆:

Content.objects.all()额外。(选择= { 'twitter_score': '选择 '的Twitter得分:' ||从content_score WHERE content_score.id = content_content.id得分'})



文章来源: Django Admin: Order by value on related Foreign Key