我有一个简单的Django应用程序,我想在数据库中定义两个表:user
和question
。
我有以下models.py
:
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
@classmethod
def create(cls, name):
user = cls(name=name)
return user
class Question(models.Model):
content = models.CharField(max_length=300)
answer = models.CharField(max_length=200)
@classmethod
def create(cls, content, answer):
question = cls(content=content, answer=answer)
return user
在/questions
中定义的views.py
中,我想显示question
类型的所有对象:
from django.views.generic.base import TemplateView
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.db import models
def questions(request):
questions = Model.objects.raw('SELECT * FROM questions')
return render_to_response('questions.html', questions)
然而,我得到了:
NameError: global name 'Model' is not defined
为什么Model
对象在models.py
中可见而在views.py
中不可见?
另外,我查询数据库的方式是否正确?
答案 0 :(得分:3)
Model
中 models.py
不可见 - 它以models.Model
的形式访问。
您正在导入models
,但尝试使用Model
代替models.Model
。
试试这个:
def questions(request):
questions = models.Model.objects.raw('SELECT * FROM questions')
return render_to_response('questions.html', questions)
或者,您可以直接导入Model
:
from django.db.models import Model
我认为这是XY problem的一个案例。
您真正想要做的是访问Question
模型的所有实例。如果您出于某种原因想要使用基于功能的视图,可以导入Question
模型并直接使用.all()
:
from myapp.models import Question
def questions(request):
questions = Question.objects.all()
return render_to_response('questions.html', questions)
然而,更好的选择是使用class based generic view。 documentation:
中的一个示例from django.views.generic import ListView
from questions.models import Question
class QuestionList(ListView):
model = Question
from django.conf.urls import url
from questions.views import QuestionList
urlpatterns = [
url(r'^questions/$', QuestionList.as_view()),
]
基于类的视图比基于功能的视图提供更大的表达能力。它们还消除了大量代码重复的需要,因为视图的常见变化部分可以单独覆盖(例如get_context_data
)
答案 1 :(得分:0)
您必须在视图中按以下方式调用模型
from myapp.models import Question
def questions(request):
questions = Question.objects.all()
return render_to_response('questions.html', questions)
有关更多信息,请阅读有关观看的官方文档... https://docs.djangoproject.com/en/1.10/topics/http/views/