【问题标题】:Django search fields in multiple models多个模型中的 Django 搜索字段
【发布时间】: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”。

【问题讨论】:

    标签: python django django-models django-views


    【解决方案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..感谢您的回答,顺便说一句,对我帮助很大。
    猜你喜欢
    • 2015-09-09
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多