如何在django admin中使用自定义字段进行搜索

时间:2017-06-08 10:09:21

标签: python django django-admin

我有一个模型,并已注册到管理员,我已使用自定义字段显示在列表中

class ReportsAdmin(admin.ModelAdmin):
    def investment(self, inst):
        return models.OrderDetail.objects.filter(user=inst.user).distinct().count()

    list_display = ['investment']
    search_fields = ['investment']

我想使用django admin中的investment字段进行搜索,但总是获得Cannot resolve keyword 'investment' into field.个选项是模型字段。

有什么方法可以使用investment字段进行搜索?

2 个答案:

答案 0 :(得分:2)

嗯,这是不允许的:

ModelAdmin.search_fields

  

设置search_fields以在管理员更改列表中启用搜索框   页。这应该设置为将要的字段名称列表   只要有人在该文本框中提交搜索查询,就会进行搜索。

     

这些字段应该是某种文本字段,例如 CharField 或   的的TextField 即可。您还可以在ForeignKey上执行相关查找   ManyToManyField使用查找API“跟随”表示法:

您根本没有这样的字段(不要介意该字段必须是TextField或CharField)。实际拥有的是管理类中的一种方法,无法在数据库级别进行搜索。即,search_fields中的内容转换为在db处执行的like '%search_term%'类型查询。

答案 1 :(得分:0)

在软件中,一切皆有可能... SMH接受的答案。您必须覆盖get_search_results

from django.db.models import Count

class ReportsAdmin(admin.ModelAdmin):
    def investment(self, inst):
        return models.OrderDetail.objects.filter(user=inst.user).distinct().count()

    list_display = ['investment']
    search_fields = ['investment']

    def get_search_results(self, request, queryset, search_term):
        # search_term is what you input in admin site
        search_term_list = search_term.split(' ')  #['apple','bar']

        if not any(search_term_list):
            return queryset, False

        if 'investment' in search_term_list:
           queryset = OrderDetail.objects.annotate(
               user_count=Count('user')
           ).filter(user_count__gte=search_term_list['investment'])

        return queryset, False