在Django中基于ForeignKeys的查询集

时间:2019-01-02 05:09:33

标签: python django

在学习Django的同时,我正在创建一个示例应用,其中有两种类型的用户:学生和教育者。教育者可以创建“学习”部分,学生可以选择自己想参加的部分(只是BooleanField是或否)。我想为每个研究创建一个“查看参与者”页面,以便教育者可以看到每个部分都在参加哪些学生。为此,我需要查询所有标记为“是”的学生用户,以参加该学习部分。我对如何使用Django的QuerySet方法执行此操作有些困惑。

这是我的模特。py

class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_educator = models.BooleanField(default=False)


class Interest(models.Model):
...


class Study(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='studies')
    name = models.CharField(max_length=255)
    interest = models.ForeignKey(Interest, on_delete=models.CASCADE, related_name='studies')

    def __str__(self):
        return self.name


class Detail(models.Model):
...


class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    interests = models.ManyToManyField(Interest, related_name='interested_students')

    def get_details(self, study):
        details = study.details.all().order_by('start_date')
        return details

    def __str__(self):
        return self.user.username


class StudentAnswer(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='study_answers')
    study = models.ForeignKey(Study, on_delete=models.CASCADE, related_name='study_participate', null=True)
    participate = models.BooleanField('Correct answer', default=False)

我想这样编写一个views.py函数:

@method_decorator([login_required, educator_required],     name='dispatch')
class StudyResultsView(DetailView):
    model = Study
    context_object_name = 'study'
    template_name = 'classroom/educators/study_results.html'

    def get_context_data(self, **kwargs):
        study = self.get_object()
        participants = study.????
        total_participants = participants.count()
        extra_context = {
            'participants': participants,
            'total_participants': total_participants,
        }
        kwargs.update(extra_context)
        return super().get_context_data(**kwargs)

    def get_queryset(self):
        return self.request.user.studies.all()

但是我无法找出正确的查询应该在participants = study.????上进行,以便选择所有标记为该研究为True的用户。

1 个答案:

答案 0 :(得分:0)

participants = study.objects.filter(study_participate__participate = True)

这一定可以。