У меня есть структура ниже, где у каждого торговца есть отношение «многие ко многим» с двумя атрибутами; Язык и Дисциплина. В форме пользователь может выбрать подмножество Tradesman, фильтруя эти атрибуты.Django для многих запросов с нулевыми формами и значениями модели
То, что я хотел бы случиться, что:
- если фильтры пользователя только один атрибут, форма выбирает все нефильтрованного атрибутов. Например. если выбрать a выбрать язык, но оставить дисциплину пустой, она не будет фильтровать по дисциплине.
- если пользователь фильтрует на языке, где у торговца нет одного набора (т. Е. Он равен нулю), он исключает этого торговца.
Я думаю, что я могу решить это с помощью барочного непифонного, недианго-метода извлечения первичных ключей из запроса и использования их, но скорее использовал бы более чистый метод.
То, что я думаю, мог бы решить, было бы:
- Динамический Джанго фильтр, который будет понижаться или включать в себя условия, в зависимости от того, если-иначе логика
Параметр, который будет соответствовать всем (в том числе нулям) что я мог бы хранить в переменной, например.
return_everything=**everything()!** Q(discipline__id__in=return_everything)
Я смотрел в Джанго docmentation и на 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)
Это работает, спасибо миллион. Что касается NB, то представление верхнего регистра было опечаткой при упрощении трески для stackoverflow, но doen't django pluralise models в admin? По этой причине я менял свой код на мои имена моделей от множественного числа до единственного; предполагая, что это означает, что это лучшая практика. В очередной раз благодарим за помощь. – sean