我有一个模型,并已注册到管理员,我已使用自定义字段显示在列表中
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
字段进行搜索?
答案 0 :(得分:2)
嗯,这是不允许的:
设置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