在学习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的用户。
答案 0 :(得分:0)
participants = study.objects.filter(study_participate__participate = True)
这一定可以。