Python 如何在Django ORM中过滤自定义查询
我想展示在给定课程中注册但未由老师添加到相应科目中的剩余学生 例如,“students_Registered=Student.objects.filter(course_Registered=sub_name.course_id.id)”获取在给定课程中注册的所有学生,即(sub_name.course_id.id)和 'students\u in_class=StudentsInClass.objects.filter(subject=subject\u id,teacher=request.user.id)'让所有学生通过'request.user.id'教师和给定主题添加到类中 是否有任何方法可以显示“已注册学生”中的学生,但“已注册学生”中的学生不在 型号.pyPython 如何在Django ORM中过滤自定义查询,python,django,django-models,django-queryset,django-orm,Python,Django,Django Models,Django Queryset,Django Orm,我想展示在给定课程中注册但未由老师添加到相应科目中的剩余学生 例如,“students_Registered=Student.objects.filter(course_Registered=sub_name.course_id.id)”获取在给定课程中注册的所有学生,即(sub_name.course_id.id)和 'students\u in_class=StudentsInClass.objects.filter(subject=subject\u id,teacher=request.
class Courses(models.Model):
id = models.AutoField(primary_key=True)
course_name = models.CharField(max_length=255)
def __str__(self):
return self.course_name
def get_absolute_url(self):
return reverse('addCourse')
class Student(models.Model):
user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True)
phone_number = models.CharField(max_length=20, blank = True)
semester = models.CharField(max_length=20, blank = True)
session_year = models.ForeignKey(Session, on_delete = models.CASCADE, null=True, related_name = 'session_year')
course_enrolled = models.ForeignKey(Courses, on_delete = models.CASCADE, null=True, related_name = 'course_enrolled')
def __str__(self):
return str(self.user) + " " + str(self.course_enrolled)
class Subjects(models.Model):
id = models.AutoField(primary_key=True)
subject_name = models.CharField(max_length=255)
course_id = models.ForeignKey(Courses, on_delete=models.CASCADE, default=1) #need to give defauult course
teacher_id = models.ForeignKey(Teacher, on_delete=models.CASCADE)
def __str__(self):
return self.subject_name
def get_absolute_url(self):
return reverse('addSubject')
class StudentsInClass(models.Model):
teacher = models.ForeignKey(Teacher,related_name="class_teacher",on_delete=models.CASCADE)
student = models.ForeignKey(Student,related_name="user_student_name",on_delete=models.CASCADE)
subject = models.ForeignKey(Subjects,related_name="user_subject_name",on_delete=models.CASCADE, null=True)
def __str__(self):
return self.subject.subject_name + " and " + self.teacher.user.email + " and " + self.student.user.email
class Meta:
unique_together = ('teacher','student', 'subject')
def random_function(request, subject_id):
# Gets the subject name
sub_name = Subjects.objects.get(id=subject_id)
# Gets the course name
course_name = Courses.objects.get(id=sub_name.course_id.id)
# Get the subjects names linked with the given course
every_subjects = Subjects.objects.filter(course_id=sub_name.course_id.id)
# Gets the names of students enrolled in the given course
students_enrolled = Student.objects.filter(course_enrolled=sub_name.course_id.id)
# Gets the names of the students present in the class of the given teacher and subject.
students_in_class = StudentsInClass.objects.filter(subject=subject_id, teacher=request.user.id)
context = {
'students_enrolled': students_enrolled,
'course_name': course_name,
'sub_name': sub_name,
}
return render(request,'teacher/random_function.html', context)
视图.py
class Courses(models.Model):
id = models.AutoField(primary_key=True)
course_name = models.CharField(max_length=255)
def __str__(self):
return self.course_name
def get_absolute_url(self):
return reverse('addCourse')
class Student(models.Model):
user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key = True)
phone_number = models.CharField(max_length=20, blank = True)
semester = models.CharField(max_length=20, blank = True)
session_year = models.ForeignKey(Session, on_delete = models.CASCADE, null=True, related_name = 'session_year')
course_enrolled = models.ForeignKey(Courses, on_delete = models.CASCADE, null=True, related_name = 'course_enrolled')
def __str__(self):
return str(self.user) + " " + str(self.course_enrolled)
class Subjects(models.Model):
id = models.AutoField(primary_key=True)
subject_name = models.CharField(max_length=255)
course_id = models.ForeignKey(Courses, on_delete=models.CASCADE, default=1) #need to give defauult course
teacher_id = models.ForeignKey(Teacher, on_delete=models.CASCADE)
def __str__(self):
return self.subject_name
def get_absolute_url(self):
return reverse('addSubject')
class StudentsInClass(models.Model):
teacher = models.ForeignKey(Teacher,related_name="class_teacher",on_delete=models.CASCADE)
student = models.ForeignKey(Student,related_name="user_student_name",on_delete=models.CASCADE)
subject = models.ForeignKey(Subjects,related_name="user_subject_name",on_delete=models.CASCADE, null=True)
def __str__(self):
return self.subject.subject_name + " and " + self.teacher.user.email + " and " + self.student.user.email
class Meta:
unique_together = ('teacher','student', 'subject')
def random_function(request, subject_id):
# Gets the subject name
sub_name = Subjects.objects.get(id=subject_id)
# Gets the course name
course_name = Courses.objects.get(id=sub_name.course_id.id)
# Get the subjects names linked with the given course
every_subjects = Subjects.objects.filter(course_id=sub_name.course_id.id)
# Gets the names of students enrolled in the given course
students_enrolled = Student.objects.filter(course_enrolled=sub_name.course_id.id)
# Gets the names of the students present in the class of the given teacher and subject.
students_in_class = StudentsInClass.objects.filter(subject=subject_id, teacher=request.user.id)
context = {
'students_enrolled': students_enrolled,
'course_name': course_name,
'sub_name': sub_name,
}
return render(request,'teacher/random_function.html', context)
正如我所看到的,类中的students将返回StudentsInClass对象。您可以使用列表理解功能进一步筛选: students\u in\u class=[每个\u对象。students\u in\u class中每个\u对象的学生] 这将返回学生对象的列表。由于现在班上的学生和注册的学生都是学生对象列表,您可以检查是否有缺少的学生: 缺少的学生=[学生中的学生对学生,如果学生不在学生中,则注册] 这将检查注册学生中的每个学生是否在班级中的学生中出现 然而,我不认为你所使用的方法对于你在课堂上创建一个新学生的每个学生都很有用。你应该考虑把StudentsInClass的学生场改为ManyToMany关系。这样,每个类就只有一个对象,它将包含所有学生