NameError:未定义全局名称“Model”

时间:2016-11-07 15:14:27

标签: python django

我有一个简单的Django应用程序,我想在数据库中定义两个表:userquestion

我有以下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中不可见?

另外,我查询数据库的方式是否正确?

2 个答案:

答案 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()

基于功能的视图

问题/ views.py

from myapp.models import Question

def questions(request):
    questions = Question.objects.all()
    return render_to_response('questions.html', questions)

基于类的视图

然而,更好的选择是使用class based generic viewdocumentation

中的一个示例

问题/ views.py

from django.views.generic import ListView
from questions.models import Question

class QuestionList(ListView):
    model = Question

urls.py

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/