如何在视图中针对多个Django模型运行查询

时间:2019-01-02 21:12:35

标签: python django model

如何对多个Django模型运行查询并通过模板显示它们?

我创建了两个模型,可以分别查询并在各自的模板中进行响应。但是,我想做的是通过Django表单提交查询,使查询针对两个模型运行,然后将结果(如果有的话)显示在单个模板上。我该如何实现?

型号:

class State(models.Model):
    text = models.TextField(null=True)
    topic_list = models.TextField(null=True)

class Hearings(models.Model):
    url = models.TextField(primary_key=True)
    title = models.TextField(null=True)
    text = models.TextField(null=True)  

观看次数:

def state(request,query):
  data = state.objects.filter(text__icontains=query).values('text','topic_list')
  return render(request,'State.html',context={'data':data})

def hearings(request,query):
  data = Hearings.objects.filter(data__icontains=query).values('url','title', 'text')
  return render(request,'Hearings.html',context={'data':data})

当前,我可以通过视图分别查询模型。我想针对两个模型通过单个视图运行查询。我该怎么办?

1 个答案:

答案 0 :(得分:1)

我对您要达到的目标尚不完全清楚,但我会尽力回答。

  

如何对多个Django模型运行查询并显示它们   通过模板?

简单的答案是,您可以根据需要在视图函数或类中对任意多个模型运行查询,并将其添加到上下文中以传递给模板。

例如:

def my_view(request):
    context = {}
    context['people'] = People.objects.all()
    context['pets'] = Pet.objects.all()
    return render(request, index.html, context)

在模板中,您可以以{{ people }}{{ pets }}的形式访问查询结果并循环查询等。您可以使用Q对象进行更复杂的查找。 https://docs.djangoproject.com/en/2.1/topics/db/queries/#complex-lookups-with-q-objects

  

[..]我要做的是通过Django表单提交查询

同样,您可以从表单提交中获取数据并将其放入查询中

def user_input(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        context = {}
        # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            pet_name = form.cleaned_data.get('pet_name') # get the name entered into the pet name form field
            person_name = form.cleaned_data.get('person_name')
            context['pets'] = Pet.objects.filter(name=pet_name)
            context['people'] = Person.objects.filter(name=person_name)
            return render(request, index.html, context)
    # if a GET (or any other method) we'll create a blank form
    else:
        form = NameForm()
    return render(request, 'name.html', {'form': form}) 

同样,您将通过传递给模板的上下文来访问返回的查询。还可以使用Q对象构建复杂的查询。 请参阅文档以获取信息https://docs.djangoproject.com/en/2.1/topics/forms/#the-view