【问题标题】:django new field generating "global name...is not defined" errordjango 新字段生成“全局名称...未定义”错误
【发布时间】:2011-01-14 03:32:18
【问题描述】:

在一个 django 应用程序中,我有一个 Word(待学习)、一个 Student(正在学习)的模型,StudentWord 是一个处理多对多关系的表:

class Word(models.Model):
    word = models.CharField(max_length=80)
    image = models.ForeignKey(Image)
    language = models.ForeignKey(Language)
    def __unicode__(self):
        return self.word

class Student(models.Model):
    username = models.ForeignKey(User)
    words = models.ManyToManyField(Word, through='StudentWord')
    def __unicode__(self):
        return self.username.username

class StudentWord(models.Model):
    word = models.ForeignKey(Word)
    student = models.ForeignKey(Student)
    level = models.IntegerField()
    nextdate = models.DateField()  <-- this field newly added
    learned = models.BooleanField()
    def __unicode__(self):
        return u'%s %s' % (self.student, self.word)

我让它工作了,但想添加一个功能,应用程序会知道下一次询问学生这个词的日期是什么时候。为此,我在 StudentWord 模型中添加了 nextdate 字段,删除了 MySQL 中的 studentword 表,使用 syncdb 重新生成它,并使用管理页面成功添加了一些 studentwords(其中包含新的日期字段)。

但是,视图的以下部分正在生成错误:

def index(request):
    last_question = request.session.get('last_question', 'none')
    student_language = request.session.get('student_language', 'english')
    student=Student.objects.get(username=request.user)
    words_student_knows = Word.objects.filter(studentword__student=student, studentword__learned=True)
    words_student_knows.filter(studentword__nextdate<=datetime.date.today())

错误是:

Exception Type:   NameError
Exception Value:  
global name 'studentword__nextdate' is not defined
Exception Location:  /home/wordcode/words/vocabulary/views.py in index, line 32

第 32 行是上面视图中 sn-p 的最后一行。当我删除该过滤器时,错误消失了,因此它似乎与新字段有关。我用了: 导入日期时间 ...在视图中,我可以在代码的其他地方使用 datetime.date.today() 没有问题。

我的猜测是它没有在新添加的字段上找到它,但是由于管理站点知道它在那里,这似乎不太可能,并且无论如何删除 studentword 表并重新创建它应该做这个把戏。

感谢任何帮助或建议。

【问题讨论】:

    标签: django datetime model field add


    【解决方案1】:

    您误解了如何在 Django 模型过滤器中传递比较。而不是你的最后一行,你需要这样做:

    words_student_knows.filter(studentword__nextdate__lte=datetime.date.today())
    

    这样拼写,​​过滤器作为关键字参数正确传递给模型管理器,然后将其分解为其组成部分并在管理器中成功处理。

    但是,您的方式意味着 Python 试图在调用函数中评估 studentword__nextdate&lt;=datetime.date.today() 的结果,旨在将布尔值传递给目标函数。当然,没有名为studentword__nextdate 的局部变量,因此会报错。

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多