多模型中的Django搜索字段

2024-09-27 22:36:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在许多模型中搜索多个字段。我不想只使用纯Django的Haystack之类的应用。例如:

# 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模型的“吨蒙大拿”
  • 来自Restaurant模式的“托尼餐厅”
  • 来自pizza模型的“托尼特殊披萨”。

Tags: djangoname模型fieldsmodelmodelsrestaurantlength
1条回答
网友
1楼 · 发布于 2024-09-27 22:36:16

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

# 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)

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

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)

这将为您提供一个所有queryset的列表,然后您可以将其塑造为您选择使用的格式。

要获取要填充search_models的模型列表,可以手动执行,也可以使用类似^{}的方法。请阅读文档以获取有关如何工作的更多信息。

相关问题 更多 >

    热门问题