Django Queryset从两个多对多类
我一直在尝试编写一个Django应用程序来管理学校学生注册,因为我有两个模型学生模型&教室模型,这两个模型是通过自定义模型(注册模型)建立的多对多相关模型,如下所示:Django Queryset从两个多对多类,django,many-to-many,django-queryset,Django,Many To Many,Django Queryset,我一直在尝试编写一个Django应用程序来管理学校学生注册,因为我有两个模型学生模型&教室模型,这两个模型是通过自定义模型(注册模型)建立的多对多相关模型,如下所示: class Student(models.Model): fname = models.CharField(max_length=50) sname = models.CharField(max_length=50) gname = models.CharField(ma
class Student(models.Model):
fname = models.CharField(max_length=50)
sname = models.CharField(max_length=50)
gname = models.CharField(max_length=50)
lname = models.CharField(max_length= 50)
stdId = models.CharField(max_length= 10)
# other student attributes
class ClassRoom(models.Model):
eduYear = models.ForeignKey(EduYear, on_delete=models.CASCADE)
stage = models.ForeignKey(Stage, on_delete=models.CASCADE)
stageClass = models.ForeignKey(StageClass, on_delete=models.CASCADE)
oneClass = models.CharField(max_length=1)
max_std = models.IntegerField(null=True, blank=True)
student = models.ManyToManyField(Student, through='Enrollment')
class Meta:
unique_together = ("stage","stageClass","eduYear","oneClass")
def __str__(self):
pass
return '{} {} {} {} '.format( self.eduYear,self.stage,self.stageClass, self.oneClass)
# so, classroom will be as (2001 KG KG1 A)
class Enrollment(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
oneClass = models.ForeignKey(OneClass, on_delete=models.CASCADE)
EduYear = models.CharField(max_length=9) #Description of education year
# other extra fields
我为用户提供了一个用于保存学生信息的数据输入屏幕,其中课堂信息是使用Django管理输入的(因为它几乎不会改变)。用户可以随时使用注册类将保存的学生链接到任何教室。这意味着一些学生可以在没有教室的情况下获救(这是一项业务要求),将他们注册到教室可以在以后完成。为了注册学生,我使用Pk为两个班级(学生和教室)中的每一个班级创建一个新的注册班级条目,如下所示:
# code to get studentPk,classRoomPk from request.POST
p =Enrollment.objects.create(student=studentPk,
classRoom=classRoomPk,
EduYear=request.POST['eduYearName'])
最后,我提供了一个搜索屏幕,允许用户按任何字段(当前为学生类的所有字段)进行搜索。
我可以开发一个显示所有学生的查询,或者一个显示所有注册学生的查询
我的问题是如何编写一个提供给所有学生的查询;他们是否已注册到clssroom,然后将结果查询集发送回模板?如果无法编写这样的查询,那么可能的解决方案是什么?
在模板中,我想将所有学生列为行,每行显示学生姓名、id和注册班级(如果学生未注册,则显示未注册)