我试图通过在对象的相关外键设定一个特定值排序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管理显示板通过“推特”得分下令内容对象
感谢大家!
我通过扩展解决了这个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')
如果我理解正确的话,你可以试试这个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排序时订购。
你可以在你的排序代码尝试这种解决方法。
由于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得分'})