2017-08-31 2 views
0

J'essaie de résoudre le cas suivant:requête pour plusieurs tables ManyToMany pour obtenir des données de plusieurs modèles dans django

nombre des étudiants a beaucoup de sujets, mais seulement certains sujets sont marqués comme ses sujets d'actualité, une salle de classe a plusieurs sujets , l'élève peut transporter des sujets d'une autre salle de classe que l'on peut vérifier dans sa classe actuelle.

Je veux obtenir tous les sujets que l'élève a actuellement avec toutes les classes que ces matières ont avec le statut de classe, actuel ou non.

class Student(models.model): 
    id = models.OnetoOneField(User) 

class Subject(models.Model): 
    Subject_Master_Id=models.AutoField(primary_key=True) 
    Subject_Name=models.CharField(max_length=100,blank=False,unique=True) 
    user = models.ManyToManyField(Student,through = 'Student_Subject') 

class Classroom(models.Model): 
    Class_Master_Id=models.AutoField(primary_key=True) 
    Classroom_Student = models.ManyToManyField(Student,through='Classroom_Student',related_name='classroom_student') 
    Classroom_Subject = models.ManyToManyField(Subject,through='Classroom_Subject',related_name='classroom_subject') 

class Student_Subject(models.Model): 
    Student_Subject_Id = models.AutoField(primary_key=True) 
    subject= models.ForeignKey(Subject,on_delete = models.CASCADE, related_name='student_subject') 
    user=models.ForeignKey(Student,on_delete = models.CASCADE, related_name='student_subject') 
    is_current = models.BooleanField()  

class Classroom_Student(models.Model): 
    Classroom_Student_Id=models.AutoField(primary_key=True) 
    Classroom_Id=models.ForeignKey(Classroom,on_delete=CASCADE) 
    Student_Id=models.ForeignKey(Student,on_delete=CASCADE, related_name= 'student') 
    is_current = models.BooleanField() 

class Classroom_Subject(models.Model): 
    Classroom_Subject_Id=models.AutoField(primary_key=True) 
    Classroom_Id=models.ForeignKey(Classroom,on_delete=CASCADE) 
    Subject_Id=models.ForeignKey(Subject,on_delete=CASCADE, related_name='subject') 

Répondre

0

OK, je vais à ce sujet par simplyfying radicalement votre modèle:

models.py

class Subject(models.Model): 
    name=models.CharField(max_length=100,blank=False,unique=True) 
    students = models.ManyToManyField(Student) 
    classroom = models.ForeignKey(Classroom) 

class Classroom(models.Model): 
    name=models.CharField(max_length=100,blank=False,unique=True) 

class Student(models.Model): 
    id = models.OnetoOneField(User) 
    current_location = models.ForeignKey(Classroom, null=True,blank=True) 

En lisant votre objectif: « Je veux obtenir tous ces sujets qui élève actuellement a avec toute la salle de classe ces sujets a le statut de salle de classe, actuelle ou non. "

Voici ce que j'ai compris que vous demandiez: 1. Quels sont les sujets étudiés par un étudiant? 2. Pour chaque sujet: 3. Fournissez des détails sur la salle de classe de ce sujet 4. Répondez si cette salle de classe correspond ou non à la classe actuelle de l'élève.

views.py

# say we are given variable student, an instance of Student model... 
students_subjects = student.subject_set.all(id=student.id) 
for subject in students_subjects: 
    description = "Subject:"+subject.name+" is in classroom:"+subject.classroom+" which is " 
    if not student.subject_set.filter(classroom=student.current_location).exists(): 
     description += "not " 
    description += "their current location." 
    print(description)