在django应用程序中,我有一个Word(需要学习)的模型,一个学生(学习它),而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)
我有它的工作,但是想添加一个功能,应用程序会知道下一个日期是什么时候向学生询问这个词。为此,我将nextdate字段添加到StudentWord模型,删除了MySQL中的studentword表,使用syncdb重新生成它,并使用管理页面成功添加了几个学生用语(在其中添加了新的日期字段)。
但是,视图的以下部分正在生成错误:
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行是上面视图中代码段的最后一行。当我删除该过滤器时,错误消失,因此它似乎与新字段有关。我用了: 导入日期时间 ...在视图中,我可以在代码中的其他位置使用datetime.date.today()而不会出现问题。
我的猜测是,它不知道它在新添加的字段上没有找到,但由于管理网站了解它在那里,这似乎不太可能,并且无论如何删除studentword表并重新创建它应该做的伎俩。
感谢任何帮助或建议。
答案 0 :(得分:9)
你误解了如何在Django模型过滤器中通过比较。而不是你的最后一行,你需要这样做:
words_student_knows.filter(studentword__nextdate__lte=datetime.date.today())
拼写为这样,过滤器正确地作为关键字参数传递给模型管理器,然后将其分解为其组成部分并在管理器中成功处理。
然而,你拥有它的方式意味着Python试图在调用函数中评估studentword__nextdate<=datetime.date.today()
的结果,目的是将布尔值传递给目标函数。当然,没有名为studentword__nextdate
的局部变量,因此错误。