2017-10-11 42 views
0

多くのモデルで複数のフィールドを検索したい。私は純粋なDjangoだけの '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' を入力すると、私が取得する必要があります:Restaurantモデルから

  • "Tonnyモンタナ" Personモデルから
  • "Tonnyのレストラン"
  • 「Tonnyさん特別ピザ "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) 

[OK]をする場合は、必ず、ここではより一般的なソリューションです。すべてのモデルのすべての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のようなものを使用します。その仕組みの詳細については、ドキュメントを読んでください。

+0

すばやくお返事ありがとうございます。これは役に立ちますが、私のプロジェクトでは、複数のフィールドを持つ30以上のモデルがあり、モデルの各フィールドにフィルタを入力しない方法があるのでしょうか? – Konrados

+0

より一般的なソリューションを追加しました。 – user6731765

関連する問題