自定义Django adminsite搜索字段查询

22 投票
3 回答
22943 浏览
提问于 2025-04-16 00:05

在Django的管理后台,你可以设置search_fields,让你能够根据指定的属性进行搜索。我的模型类有一个属性,但这个属性并不是一个真正的模型属性,也就是说,它不在数据库表里。这个属性和另一个数据库表有关,但这个表和当前模型没有直接的关系。

不过,我希望能够对这个属性进行搜索,所以我需要以某种方式自定义管理后台生成的查询,以便在填写搜索字段时进行过滤——这可能吗?如果可以的话,应该怎么做呢?

我可以查询我自定义属性的数据库表,然后返回符合搜索条件的模型类的ID。然后,正如我所说的,这些ID需要融入到管理后台的搜索查询中。

谢谢!

3 个回答

-2

这可能会对你有帮助

search_fields = ['foreign_key__related_fieldname']

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields

-1

你应该在扩展了 admin.ModelAdmin 的管理类中使用 search_fields = ['foreign_key__related_fieldname'],就像 search_fields = ['user__email'] 这样。

想了解更多,可以点击 这里

32

从Django 1.6开始,你可以通过在你的ModelAdmin子类中定义一个get_search_results方法来定制搜索功能。

这个内容在Django的官方文档中解释得很清楚。下面的例子是从这个文档中复制过来的。

class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'age')
    search_fields = ('name',)

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
        try:
            search_term_as_int = int(search_term)
            queryset |= self.model.objects.filter(age=search_term_as_int)
        except:
            pass
        return queryset, use_distinct

撰写回答