我有一个模型管理员,我可以通过这种方式覆盖get_search_result
def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super(OccupancyAdmin, self).get_search_results(
request, queryset, search_term
)
search_words = search_term.split(",")
if search_words:
q_objects = [
Q(**{field + "__icontains": word})
for field in self.search_fields
for word in search_words
]
queryset |= self.model.objects.filter(reduce(or_, q_objects))
return queryset, use_distinct
建议来自这里:Is there a way to search for multiple terms in admin search? django
我面临的问题如下:rangefilter
中的 DateTimeRangeFilter
和我的自定义 SimpleListFilter
都不再按预期工作。过滤器似乎已被禁用。
我查看了正在执行的 SQL 查询,它们看起来没问题。
我很确定我以某种方式弄乱了查询集,但不知道如何调试它。
最佳答案
对我有用的是在 super() 之前声明一个原始查询集,最后拦截两个查询集:
def get_search_results(self, request, queryset, search_term):
orig_queryset = queryset
queryset, use_distinct = super().get_search_results(request, queryset, search_term)
search_words = search_term.split(",")
if search_words:
q_objects = [
Q(**{field + "__icontains": word})
for field in self.search_fields
for word in search_words
]
queryset |= self.model.objects.filter(reduce(or_, q_objects))
queryset = queryset & orig_queryset
return queryset, use_distinct
否则,使用@simon-spa的答案,通过修改后的get_search_results()
执行的任何修改都将被忽略(但过滤器确实可以工作)。
关于python - 如何在 ModelAdmin 中重写 Django get_search_results 方法,同时保持过滤器按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64571673/