私は小さな語彙クイズ アプリを作成しています。単語の基本モデルは次のとおりです。
class Word(models.Model):
id = models.AutoField(primary_key=True)
word = models.CharField(max_length=80)
id_image = models.ForeignKey(Image)
def __unicode__(self):
return self.word
class Meta:
db_table = u'word'
私が現在自問自答している単語のモデルは次のとおりです。
class WordToWorkOn(models.Model):
id = models.AutoField(primary_key=True)
id_student = models.ForeignKey(Student)
id_word = models.ForeignKey(Word)
level = models.IntegerField()
def __unicode__(self):
return u'%s %s' % (self.id_word.__unicode__(), self.id_student.__unicode__() )
class Meta:
db_table = u'word_to_work_on'
ここでの「レベル」は、私がそれをどれだけよく学んだかを示します。私がすでに学んだ一連の単語には、次のモデルがあります。
class WordLearned(models.Model):
id = models.AutoField(primary_key=True)
id_word = models.ForeignKey(Word, related_name='word_to_learn')
id_student = models.ForeignKey(Student, related_name='student_learning_word')
def __unicode__(self):
return u'%s %s' % (self.id_word.__unicode__(), self.id_student.__unicode__() )
class Meta:
db_table = u'word_learned'
WordToWorkOn のクエリセットが返す結果が少なすぎる場合 (WordLearned に移動され、WordToWorkOn から削除されるほど十分に学習されているため)、それに追加する Word を見つけたいと思います。良い方法がわからない部分は、WordLearned にまだ含まれていない単語に限定することです。
したがって、一般的に言えば、単語のクエリセットに対して何らかの .exclude() を実行したいと考えていますが、WordLearned テーブルのメンバーシップに基づいて除外する必要があります。これを行う良い方法はありますか?クエリセットの結合に関する参照はたくさんありますが、これを行う方法についての適切な参照が見つかりませんでした (おそらく、検索する適切な用語がわからないだけです)。
最終的にこれはマルチユーザー アプリになり、すべてのユーザーにフラグを付けたくないため、学習済み、作業中、未学習を示すために各 Word にフラグを使用したくありません。したがって、各セットに複数のテーブルが適していると考えました。
すべてのアドバイスをいただければ幸いです。