2015-02-07 3 views
0

У меня есть модель:Джанго фильтр аннотировать MTM

class Lesson(models.Model): 
    ... 
    required_lessons = models.ManyToMany('self') 
    ... 

Когда урок пользователь проходит, я создать запись в таблице:

class UserLesson(models.Model): 
    user = models.ForeignKey(User) 
    lesson = models.ForeignKey('courses.Lesson') 
    is_passed = models.BooleanField(default=False) 
    created = models.DateTimeField(auto_now_add=True) 

Теперь, как я могу проверить, если пользователь имеет доступ к уроку ?

+0

Что вы имеете в виду под «доступом к уроку»? – Carlos

+0

Например: у нас есть lesson1, lesson2, lesson3, и мне нужно пройти урок 1, 2, чтобы получить доступ к уроку 3. И этот уроки 1, 2 мы установили в поле required_lessons mtm – Arti

ответ

0

Что-то вроде этого:

 
def has_access(user, lesson): 
    completed = user.userlesson_set.filter(is_passed=True).values_list("lesson", flatten=True) 
    return all([l in completed for l in lesson.required_lessons]) 

PS: не тестировалось, корректировки могут быть необходимы

+0

Представьте, что у нас много уроков ... Как это сделать с помощью парных запросов? – Arti

+0

Я думаю о: закончите уроки, как вы писали, а затем нам нужно .annotate (завершено = Count (завершено)), например. И если у нас есть переменная завершена = 0, тогда доступ запрещен. Но как это сделать на практике, я не знаю. – Arti

+0

Затем вы можете сделать завершен = user.userlesson_set.filter (is_passed = True) .count() – Carlos

Смежные вопросы