2010-02-07 74 views
1

在django应用程序中,我有一个Word(待学),一个学生(学习它)的模型,而StudentWord是处理多对多的关系:django生成“全局名称...未定义”的新字段错误

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重新生成了它,并使用管理页面成功添加了一些学生字(包含日期的新字段)。

然而,鉴于下面一部分产生一个错误:

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是从上方的视图中的片段的最后一行。当我删除该过滤器时,错误消失,所以它似乎与新字段有关。我使用: import datetime ...在视图中,我可以在代码中的其他地方使用datetime.date.today()而不会出现问题。

我的猜测是,它不知道它在新增加的字段中没有找到,但由于管理站点明白它在那里,似乎并不可能,并且无论如何删除studentword表并重新创建它应该做的伎俩。

任何帮助或建议表示赞赏。

回答

9

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

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

拼写这种方式,过滤器被正确地传递到模型管理器作为关键字参数,然后将其分解成它的组成部分和处理在经理内成功。

尽管如此,Python意味着Python试图在调用函数中计算studentword__nextdate<=datetime.date.today()的结果,旨在将布尔值传递到目标函数。当然,没有局部变量叫做studentword__nextdate,因此是错误的。

+0

你是对的,谢谢! – rossdavidh 2010-02-14 00:03:19