[英]Django Query Multi Table
我正在尝试对一个字段进行表单查询,目标是让所有孩子都注册到此下拉菜单中的所有教师课程中。 我现在的查询是获取教师注册的所有课程。 但是,我如何检索这些类中的孩子。 我附上了一张图片,以便您可以直观地看到我如何链接表格。
FORMS.PY
class Select_Student_Phone_Log_Form(forms.ModelForm):
class Meta:
model = PhoneLog
fields = ('student_ps',)
labels = {'student_ps':_('Student Name') }
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super (Select_Student_Phone_Log_Form,self).__init__(*args,**kwargs )
students = SectionEnrollment.objects.filter(section_id__teacher_username = self.user)
self.fields['student_ps'].queryset= students
MODELS.PY
# Section Information Stored
class Section(models.Model):
sectionpsid= models.CharField(primary_key = True, default = "", max_length = 50)
schoolpsid = models.ForeignKey(School,on_delete = models.CASCADE, default = "" ,)
coursepsid = models.ForeignKey(Course,on_delete = models.CASCADE, default = "" ,)
termpsid = models.ForeignKey(Term,on_delete = models.CASCADE, default = "" ,)
section_number = models.CharField(default = "", max_length = 50)
expression = models.CharField(default = "", max_length = 50)
external_expression= models.CharField(default = "", max_length = 50)
staffpsid = models.ForeignKey(Staff,on_delete = models.CASCADE, default = "" ,)
gradebooktype = models.CharField(default = "", max_length = 50)
teacher_username = models.ManyToManyField(User)
# Creation of Classrooms and Assigned Teachers
class SectionEnrollment(models.Model):
sectionenrollmentpsid = models.CharField(primary_key = True,max_length = 50, default = "")
section = models.ForeignKey(Section,on_delete = models.PROTECT, default = "" ,)
studentpsid = models.ForeignKey(Student,on_delete = models.CASCADE, default = "" ,)
entry_date = models.DateField(blank=True)
exit_date = models.DateField(blank=True)
dropped = models.BooleanField(default = False, blank = True)
# Where Basic Student Data Is Stored
class Student(models.Model):
studentpsid= models.CharField(primary_key = True , default = "", max_length = 50, unique = True)
student_name = models.CharField(max_length = 50)
first_name = models.CharField(max_length = 50, default = "")
last_name = models.CharField(max_length = 50,default = "")
gender = models.CharField(max_length = 1,default = "")
student_grade = models.CharField(max_length = 2, default = "")
home_room = models.CharField(max_length = 5, default = "")
student_enrollment = models.CharField(max_length = 2, default = "")
school_number = models.CharField(max_length = 15, default = "")
email = models.EmailField(default = "")
projected_graduation_year = models.CharField(max_length = 4, default = "")
counseling_goal = models.TextField(max_length = 255)
win_username = models.CharField(max_length = 50)
win_password = models.CharField(max_length = 50)
offsite_laptop = models.BooleanField(default = False, blank = True)
image = models.ImageField(default ="default.png", upload_to ='student_pics')
# Stores Phone Log Information
class PhoneLog(models.Model):
student_ps = models.ForeignKey(Student,on_delete = models.CASCADE, default ="")
created_at = models.DateTimeField(default = timezone.now)
comments = models.TextField(max_length = 355, default= "")
RESULT_CHOICES = [
(None, 'PLEASE SELECT A RESULT'), # THIS IS OPTIONAL
(1, 'Spoke to Mom'),
(2, 'Spoke to Dad'),
(3, 'Spoke to Guardian'),
(4, 'Left message'),
(5, 'Messages Full'),
(6, 'Sent Email'),
(7, 'Other'),
]
result = models.PositiveSmallIntegerField(choices = RESULT_CHOICES)
created_by = models.ForeignKey(User, on_delete = models.PROTECT)
class Meta:
verbose_name = "K8-Phone Log"
def __str__(self):
return self.student_ps.student_name
我会试试这个:
class Select_Student_Phone_Log_Form(forms.ModelForm):
class Meta:
model = PhoneLog
fields = ('student_ps',)
labels = {'student_ps':_('Student Name') }
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(Select_Student_Phone_Log_Form, self).__init__(*args, **kwargs )
self.fields['student_ps'].queryset = Student.objects.filter(sectionenrollment__section__teacher_username=self.user)
这与@Benbb96 的建议略有不同。 不同之处在于,不要覆盖查询集,您可能会删除您可能需要的过滤器。
class SelectStudentPhoneLogForm(forms.ModelForm):
class Meta:
model = PhoneLog
# fields = ('student_ps',)
fields = ('student',)
# labels = {'student_ps': _('Student Name')}
labels = {'student': _('Student Name')}
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
# super (Select_Student_Phone_Log_Form,self).__init__(*args,**kwargs )
super(SelectStudentPhoneLogForm, self).__init__(*args, **kwargs )
# students = SectionEnrollment.objects.filter(section_id__teacher_username = self.user)
section_enrollments_qs = SectionEnrollment.objects.filter(section__teachers=self.user)
queryset = self.fields['student'].queryset
queryset = queryset.filter(id__in=section_enrollments_qs.values("student_id"))
self.fields['student'].queryset = queryset
此外,我冒昧地添加了测试,正确命名了所有字段,并添加了评论。 你可以在这里找到它: https : //gist.github.com/kingbuzzman/e5cb7807e8722f3712988f264d61d328#file-filter_form_student-py-L121
可以在下面进一步找到测试https://gist.github.com/kingbuzzman/e5cb7807e8722f3712988f264d61d328#file-filter_form_student-py-L225
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.