私は以下のモデル構造を持っています。ここで、各商人は2つの属性を持つ多対多の関係を持っています。言語と規律。フォームでは、ユーザーはこれらの属性でフィルタリングすることにより、Tradesmanのサブセットを選択できます。
私がしたいのは、それです:
- ユーザーが1つの属性のみをフィルタリングする場合、フォームはフィルタリングされていないすべての属性を選択します。例えば。選択した言語を選択し、分野を空白のままにした場合、分野でフィルタリングされません。
- 商人が1つのセットを持たない(つまりnullである)言語でユーザーがフィルターをかけると、その商人は除外されます。
クエリから主キーを抽出して使用するバロック式の非pythonesque、non-djangoの方法でこれを解決できると思いますが、よりクリーンな方法を使用したいと思います。
私がそれを解決できると思うのは:
- if-elseロジックに応じて条件を削除または含める動的なdjangoフィルター
変数に格納できるすべて(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)