2015-02-07 61 views
0

我有一个模型:Django的过滤器注释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 2015-02-07 11:46:29

+0

例如:我们有lesson1,lesson2,lesson3,我需要通过第1,2课以获得第3课的学习。并且我们在required_lessons mtm字段 – Arti 2015-02-07 11:49:57

回答

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

中设置了这个课程1,2。想象一下,我们有很多课程...如何与几个查询做到这一点? – Arti 2015-02-07 13:36:08

+0

我想:按照你的写法完成课程,然后我们需要.annotate(completed = Count(completed))例如。如果我们有变量完成= 0,那么访问被拒绝。但在实践中如何做到这一点,我不知道。 – Arti 2015-02-07 13:40:31

+0

然后你可以完成= user.userlesson_set.filter(is_passed = True).count() – Carlos 2015-02-07 13:44:26