Django多对多查询使用空表单和模型值



我有下面的模型结构,其中每个交易者都有一个具有两个属性的多对多关系;语言和纪律。在表单中,用户可以通过过滤这些属性来选择Tradesman的子集。

我希望发生的事情是:

  1. 如果用户只筛选一个属性,则表单将选择所有未过滤的属性。如果选择一种语言将纪律留空,它不会过滤纪律
  2. 如果用户在商人没有的语言上进行筛选一个集合(即它为空),它排除了那个商人

我想我可以通过一种巴洛克式的非蟒蛇式、非django方法来解决这个问题,即从查询中提取主键并使用它们,但我宁愿使用更干净的方法。

我认为可以解决的是:

  1. 一个动态django过滤器,它将根据if-else逻辑删除或包含条件
  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)
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"

相关内容

  • 没有找到相关文章

最新更新