「グローバル名…は定義されていない」エラーを生成するDjango新しいフィールド
質問
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モデルに追加し、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行目は、上記のビューからのスニペットの最後の行です。そのフィルターを削除すると、エラーがなくなるため、新しいフィールドに関連しているようです。使用しました:DateTimeをインポート...ビューで、そして問題なくコードの他の場所でdatetime.date.today()を使用することができます。
私の推測では、どういうわけか新たに追加されたフィールドで取り上げられていませんが、管理サイトはそれがそこにあることを理解しているので、それはおそらくそうではないようであり、いずれにしても学生語テーブルを削除して再作成することは、騙す。
どんな助けやアドバイスをいただければ幸いです。
解決
Djangoモデルフィルターで比較に合格する方法を誤解しています。最後の行の代わりに、これを行う必要があります。
words_student_knows.filter(studentword__nextdate__lte=datetime.date.today())
このように綴られて、フィルターはモデルマネージャーに正しく渡されます キーワード引数, 、その後、その構成部品に分解され、マネージャー内で正常に処理されます。
しかし、あなたがそれを持っていた方法は、Pythonがの結果を評価しようとしていたことを意味しました studentword__nextdate<=datetime.date.today()
呼び出し関数のすぐそこに、宛先関数にブール値を渡すことを目指しています。もちろん、局所変数はありません studentword__nextdate
, 、したがってエラー。