django новое поле, генерирующее ошибку «глобальное имя ... не определено» - PullRequest
1 голос
/ 07 февраля 2010

В приложении 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)

У меня это работало, но я хотел добавить функцию, чтобы приложение узнало, когда будет следующая дата, чтобы спросить студента об этом слове. Для этого я добавил поле nextdate в модель StudentWord, удалил таблицу ученических слов в MySQL, использовал 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 и воссоздание ее должно сделать трюк.

Любая помощь или совет приветствуется.

1 Ответ

9 голосов
/ 08 февраля 2010

Вы неправильно поняли, как проходите сравнения в фильтрах моделей Django. Вместо вашей последней строки вам нужно сделать следующее:

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

В этом случае фильтр правильно передается менеджеру модели в виде ключевого аргумента , который затем разбивается на составные части и успешно обрабатывается в менеджере.

То, как вы это сделали, означало, что Python пытался вычислить результат studentword__nextdate<=datetime.date.today() прямо в вызывающей функции, стремясь передать логическое значение функции назначения. Конечно, нет локальной переменной с именем studentword__nextdate, следовательно, ошибка.

...