Во-первых, пара замечаний о стиле.
Нет необходимости добавлять префикс полей внешнего ключа к id_
.Базовое поле базы данных, которое Django создает для этих FK, в любом случае имеет суффикс _id
, поэтому вы получите что-то вроде id_word_id
в БД.Ваш код станет намного понятнее, если вы просто назовете поля «слово», «студент» и т. Д.
Кроме того, нет необходимости указывать id
автополя в каждой модели.Они создаются автоматически, и вы должны указывать их только в том случае, если вам нужно назвать их как-нибудь еще.Точно так же нет необходимости указывать db_table
в вашей мета-версии, поскольку это также выполняется автоматически.
Наконец, нет необходимости вызывать __unicode__
для полей в вашем методе Unicode.Интерполяция строк сделает это автоматически, и, если вы пропустите его, ваш код будет намного легче читать.(Если вы действительно хотите сделать это явно, по крайней мере, используйте форму unicode(self.word)
.)
В любом случае, к вашему актуальному вопросу.Вы не можете «соединять» наборы запросов как таковые - обычный способ сделать кросс-модельный запрос - это иметь чужой ключ от одной модели к другой.Вы могли бы сделать это:
words_to_work_on = Word.objects.exclude(WordLearned.objects.filter(student=user))
, который под капотом сделает подзапрос, чтобы получить все объекты WordLearned для текущего пользователя и исключить их из списка возвращенных слов.
Однако, особенно учитывая ваши будущие требования к многопользовательскому приложению, я думаю, что вам следует реструктурировать свои таблицы.Вам нужны отношения ManyToMany между Word и Student с таблицей-посредником, которая фиксирует статус Word для конкретного Student.Таким образом, вы можете избавиться от таблиц WordToWorkOn и WordLearned, которые в основном являются дубликатами.
Что-то вроде:
class Word(models.Model):
word = models.CharField(max_length=80)
image = models.ForeignKey(Image)
def __unicode__(self):
return self.word
class Student(models.Model):
... name, etc ...
words = models.ManyToManyField(Word, through='StudentWord')
class StudentWord(models.Model):
word = models.ForeignKey(Word)
student = models.ForeignKey(Student)
level = models.IntegerField()
learned = models.BooleanField()
Теперь вы можете получить все слова для изучения для конкретного учащегося:
words_to_learn = Word.objects.filter(studentword__student=student, studentword__learned=False)