[英]Django Admin: Order by value on related Foreign Key
我正在嘗試通過對象相關外鍵集中的特定值對Django Admin列表頁面進行排序。
具體來說,在下面的代碼中,我希望ContentAdmin視圖顯示按“ Twitter分數”(名稱為“ 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”分數排序的內容對象
感謝大家!
我通過擴展ContentAdmin
類的get_queryset
方法解決了這一問題。 之后,只需要獲取正確的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')
如果我理解正確,則可以從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')
上面將告訴Django在嘗試按admin中的colored_first_name排序時,按first_name字段排序。
您可以在代碼中嘗試此變通辦法以進行排序。
由於django admin使用db進行排序,因此您無法對列表中顯示的功能進行排序。
您可以做的是將要顯示的列添加到django admin用於列出模型的查詢集中,這樣就可以進行排序。
要添加列,您需要使用queryset extra方法。
這應該可以解決問題:)
Content.objects.all().extra(select={'twitter_score': 'SELECT score from content_score WHERE content_score.id = content_content.id'})
獎金回合:
Content.objects.all()。extra(select = {'twitter_score':'SELECT'Twitter得分:'||從content_score得分WHERE content_score.id = content_content.id'})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.