1

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でstudentwordテーブルを削除し、syncdbを使用して再生成し、管理ページを使用していくつかのstudentwordを正常に追加しました(日付の新しいフィールドを含む)。

ただし、ビューの次の部分でエラーが発生しています。

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()を問題なく使用できることです。

私の推測では、どういうわけか、新しく追加されたフィールドには表示されていませんが、管理サイトはそこにあることを理解しているので、そうは思われません。いずれにしても、studentwordテーブルを削除して再作成すると、騙す。

ヘルプやアドバイスをいただければ幸いです。

4

1 に答える 1

9

Django モデル フィルターで比較を渡す方法を誤解しています。最後の行の代わりに、これを行う必要があります。

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

このように綴ると、フィルターはキーワード引数としてモデル マネージャーに正しく渡され、構成要素に分解され、マネージャー内で正常に処理されます。

ただし、あなたのやり方は、Python がstudentword__nextdate<=datetime.date.today()呼び出し元の関数のすぐそこにある結果を評価しようとしていて、ブール値を宛先関数に渡すことを目指していたことを意味していました。もちろん、というローカル変数がないstudentword__nextdateため、エラーが発生します。

于 2010-02-07T21:33:33.493 に答える