簡體   English   中英

Django Admin:按相關外鍵上的值排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM