0

私は以下のモデル構造を持っています。ここで、各商人は2つの属性を持つ多対多の関係を持っています。言語と規律。フォームでは、ユーザーはこれらの属性でフィルタリングすることにより、Tradesmanのサブセットを選択できます。

私がしたいのは、それです:

  1. ユーザーが1つの属性のみをフィルタリングする場合、フォームはフィルタリングされていないすべての属性を選択します。例えば。選択した言語を選択し、分野を空白のままにした場合、分野でフィルタリングされません。
  2. 商人が1つのセットを持たない(つまりnullである)言語でユーザーがフィルターをかけると、その商人は除外されます。

クエリから主キーを抽出して使用するバロック式の非pythonesque、non-djangoの方法でこれを解決できると思いますが、よりクリーンな方法を使用したいと思います。

私がそれを解決できると思うのは:

  1. if-elseロジックに応じて条件を削除または含める動的なdjangoフィルター
  2. 変数に格納できるすべて(nullを含む)に一致するパラメーター。

     return_everything=**everything()!** 
     Q(discipline__id__in=return_everything)
    

私はdjangoのドキュメントとstackoverflowを調べていましたが、どちらも実行する方法が見つかりません。助けてくれてありがとう。

models.py:

class Discipline(models.Model):  
    discipline=models.CharField(max_length=200, unique=True)

class Language(models.Model):  
    language=models.CharField(max_length=200, unique=True)

class Tradesman(models.Model):  
    discipline=models.ManyToManyField(Discipline, blank=True, null=True)
    language=models.ManyToManyField(Language, blank=True, null=True)

forms.py

class TradesmanForm(forms.Form):
    #select all values to output in the form
    discipline_all=.Discipline.objects.all() 
    language_all=Language.objects.all() 

    #declare form variables
    discipline=forms.ModelMultipleChoiceField(queryset=discipline_all,required=False)  
    language=forms.ModelMultipleChoiceField(queryset=language_all,required=False) 

    #clean data
    def clean(self) 
        cleaned_data=super(TradesmanForm, self).clean()
        return cleaned_data

views.py

def TrademanLookup(request)
    if request.method == 'POST':      
        if form.is_valid()
            discipline=form.cleaned_data['discipline']
            language=form.cleaned_data['language']
            #################################################
            #  how can I make the below query dynamic,      # 
            #  or else pass a variable into it that selects # 
            #  everything, including nulls?                 #
            #################################################
            tradesman_return=Tradesman.objects.filter(
                Q(discipline__id__in=discipline),
                Q(language__id__in=language)
                )
            ...work with returned data...
        else:
            ...something else...
    else:
            ...something else...

    return render_to_response('some.html','somevar':somevar)
4

1 に答える 1

1
def TrademanLookup(request)
    if request.method == 'POST':      
        if form.is_valid()
            discipline=form.cleaned_data['discipline']
            language=form.cleaned_data['language']
            query = []
            if disciplines:
                query.append(Q(discipline__in=discipline))
            if language:
                query.append(Q(language__in=language))

            if query:    
                tradesman_return=Tradesman.objects.filter(*query)
            else:
                tradesman_return=Tradesman.objects.all()

            #...work with returned data...

注: コレクションに複数形を使用することは GoodPractice(TM) と見なされます (Trademan モデルとフォームの両方で、実際には「規律」と「言語」である必要があります。

NB2 : 関数には all_lower_with_underscore 名を使用するのが慣習であるため、ビューには「trademan_lookup」という名前を付ける必要があります。

于 2013-02-20T12:47:02.257 に答える