多个模型中的 Django 搜索字段

Posted

技术标签:

【中文标题】多个模型中的 Django 搜索字段【英文标题】:Django search fields in multiple models 【发布时间】:2018-03-23 12:54:33 【问题描述】:

我想在多个模型中搜索多个字段。我不想使用像“Haystack”这样的其他应用程序,只有纯 Django。例如:

# models.py

class Person(models.Model):
    first_name = models.CharField("First name", max_length=255)
    last_name = models.CharField("Last name", max_length=255)
    # other fields


class Restaurant(models.Model):
    restaurant_name = models.CharField("Restaurant name", max_length=255)
    # other fields


class Pizza(models.Model):
    pizza_name = models.CharField("Pizza name", max_length=255)
    # other fields

当我输入“Tonny”时,我应该得到一个:

Person 模特的“Tonny Montana” Restaurant 模特的“Tonny's Restaurant” Pizza 模特的“Tonny's Special Pizza”。

【问题讨论】:

【参考方案1】:

一种解决方案是查询所有模型

# Look up Q objects for combining different fields in a single query
from django.db.models import Q
people = Person.objects.filter(Q(first_name__contains=query) | Q(last_name__contains=query)
restaurants = Restaurant.objects.filter(restaurant_name__contains=query)
pizzas = Pizza.objects.filter(pizza_name__contains=query)

然后根据需要合并结果

from itertools import chain
results = chain(people, restaurants, pizzas)

好的,当然,这是一个更通用的解决方案。搜索所有模型中的所有 CharFields:

search_models = [] # Add your models here, in any way you find best.
search_results = []
for model in search_models:
    fields = [x for x in model._meta.fields if isinstance(x, django.db.models.CharField)]
    search_queries = [Q(**x.name + "__contains" : search_query) for x in fields]
    q_object = Q()
    for query in search_queries:
        q_object = q_object | query

    results = model.objects.filter(q_object)
    search_results.append(results)

这将为您提供所有查询集的列表,然后您可以将其塑造成您选择使用的格式。

要获取要填充search_models 的模型列表,您可以手动完成,或使用类似get_models 的方法。阅读文档以了解有关其工作原理的更多信息。

【讨论】:

感谢您的快速回复。这很有帮助,但是在我的项目中,我有 30 多个具有多个字段的模型,我想知道有没有办法不对模型中的每个字段都键入过滤器? 添加了更通用的解决方案。 它将显示所有模型的所有数据,如何在通用解决方案中使用自定义模型管理器。 以防万一其他人卡在 django 上未定义: import: from django.db.models import Q, CharField 然后将上面代码中的 django.db.models.CharField 更改为 CharField..感谢您的回答,顺便说一句,对我帮助很大。

以上是关于多个模型中的 Django 搜索字段的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 django 过滤器为给定模型中的所有字段创建一般搜索

Python / Django中多个抽象模型继承中的字段菱形模式

具有多个字段的模型中的查询集(Django)

在 Django 中,正确地制作具有多个类别、多个标签和搜索的查询集?

Django 模型:多个外键或一对一字段

有效地更新同一字段多个对象django