python - 如何在 ModelAdmin 中重写 Django get_search_results 方法,同时保持过滤器按预期工作?

标签 python django django-admin django-filter

我有一个模型管理员,我可以通过这种方式覆盖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/

相关文章:

python - 具有多个同时序列的 Keras 序列预测

python - 将 N 个点放入 M 个相等的箱子中

python - XLSXWriter 拒绝创建第二个 Excel 文件

python - 删除 django 模型类对象而没有外键警告

python - Django REST Framework 如何将上下文添加到 ViewSet

django - 将 Django 管理面板对象创建功能与多对多模型结合使用

django - 重新填充 Django ChoiceField 而不重新启动服务器

Python 字典,提取值

python - Celery Django - 自定义任务发现

Django - 管理员 - 带有 ' * ' 的必填字段