我有下面的模型结构,其中每个交易者都有一个具有两个属性的多对多关系;语言和纪律。在表单中,用户可以通过过滤这些属性来选择Tradesman的子集。
我希望发生的事情是:
- 如果用户只筛选一个属性,则表单将选择所有未过滤的属性。如果选择一种语言将纪律留空,它不会过滤纪律
- 如果用户在商人没有的语言上进行筛选一个集合(即它为空),它排除了那个商人
我想我可以通过一种巴洛克式的非蟒蛇式、非django方法来解决这个问题,即从查询中提取主键并使用它们,但我宁愿使用更干净的方法。
我认为可以解决的是:
- 一个动态django过滤器,它将根据if-else逻辑删除或包含条件
-
一个参数,它将匹配我可以存储在变量中的所有内容(包括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)
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模型和形式中都应该是"学科"one_answers"语言")。
NB2:惯例是为函数使用all_lower_with_underscore名称,因此您的视图应命名为"trademan_lookup"