0

フォームに名前を付けた検索フィールドがありますq。メンバーを検索するときに、次のようにフィルターをかけたい

results = Member.objects.filter(Q(mid=q) | Q(mobile=q)).order_by('pub_date')

他の形で、私は似たようなことをしたいと思っています。
そのような :

Account.objects.filter(Q(name=q)|Q(card=q)).order_by('pub_date')


が必要なexactly equal filterので、使用django-haystackはやり過ぎです。

単純な基本形:

class SimpleSearchForm(forms.Form):
    q = forms.CharField(required=False)
    search_fields = []

    def __init__(self, model=None):
        super(SimpleSearchForm, self).__init__()
        if not model:
            raise Exception('SimpleSearchForm need init with a model')

        self.model = model

    def search(self):
        q = self.cleaned_data['q']

        if len(self.search_fields) > 0:
            # construct a Q() statement, filter result and return

しかし、そのような Q() ステートメントを作成する方法がわかりません。

4

1 に答える 1

1

わかりましたので、私が正しく理解している場合、最終的には「そのような Q() ステートメントを作成する方法」を尋ねていることになります。

動的な Q() ステートメントを作成するには、強力な **kwargs 機能を使用できます。次のクエリを動的に作成する場合:

results = Member.objects.filter(Q(mid=q) | Q(mobile=q))

コードは次のとおりです。

from django.db.models import Q
import operator
predicates = [('mid', q), ('mobile', q)] # You may form this list dynamically as per your requirement
q_list = [Q(x) for x in predicates] # generates a list of Q objects dynamically
results = Member.objects.filter(reduce(operator.or_, q_list)) # to combine all Q objects, reduce and operator python methods are used

このようにして、動的クエリを作成できます

詳細な説明については、こちらをご覧ください

于 2014-09-18T08:19:27.743 に答える