django admin - 更改 search_fields 结果排序

1 投票
1 回答
1155 浏览
提问于 2025-04-18 12:13

有没有办法在你的 admin.py 文件中使用 search_fields 时,改变搜索结果的排序呢?

这是我目前的代码:

# models.py

class Book(models.Model):
    # ...
    name = models.CharField(...)
    description = models.TextField(...)

还有:

#admin.py

class BookAdmin(admin.ModelAdmin):
    # ...
    search_fields = ('name', 'description')

当我在管理页面搜索时,Django 会从 namedescription 中聚合很多结果,并以一种我无法理解的顺序返回。我只是想让结果中 name 的内容排在 description 的前面。

在 Django 中,有办法做到这一点吗?

1 个回答

3

你可以通过Meta选项来设置一个模型的默认排序,这样管理员在查看实例时就会按照这个顺序排列:

class Book(models.Model):
    #...
    class meta:
        ordering = ['name', 'description']

你也可以直接在管理员界面中设置排序:

class BookAdmin(admin.ModelAdmin):
    # ...
    search_fields = ('name', 'description')
    ordering = ['name', 'description']

根据你的评论更新:

如果你只想影响结果的顺序,可以在获取结果的查询集中进行拦截,像这样:

class BookAdmin(admin.ModelAdmin):
    # ...
    search_fields = ('name', 'description')

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super(BookAdmin, self).get_search_results(request, queryset, search_term)
        queryset = queryset.order_by('name', 'description')
        return queryset, use_distinct

虽然这个操作的结果在后续过程中可能会再次被排序,但这就是能给你一个有序结果列表的方法。

撰写回答