2016-08-04 4 views
0

Vor allem, lassen Sie mich für mein Englisch entschuldigen - es ist nicht meine Muttersprache.Mehrere Argumente für das Rendern der Vorlage übergeben

Ich habe folgende Modelle:

class Student(models.Model): 
    student_id = models.IntegerField(primary_key=True) 
    student_name = models.CharField(max_length=255, default='John Doe') 
    dob = models.DateField(max_length=8) 

class Group(models.Model): 
    group_name = models.CharField(max_length=40) 
    monitor = models.ForeignKey(Student) 

class Student_Group(models.Model): 
    student_id = models.ForeignKey(Student) 
    group_name = models.ForeignKey(Group) 

Ich brauche Gruppen von Studenten zu machen, seine Monitore und Menge des Schülers in jeder Gruppe. ersten beiden Aufgaben zu machen ist kein Problem:

views.py:

def group_list(request): 
    groups = Group.objects.all() 
    return render(request, 'groups/group_list.html', {'groups': groups}) 

groups.html

{% for group in groups %} 
    <p>{{ group.group_name }}</p> 
    <p>{{ group.monitor }}</p> 
{% endfor %} 

Aber wenn es darum geht, für jede Gruppe Menge von Studenten Rendering Ich bleibe stecken.

Nach SQL läßt

select count(*) from students_student 
join students_student_group 
on students_student.student_id = students_student_group.student_id_id 
where students_student_group.group_name_id = "Mega nerds" 

Fragen sind Menge von Studenten zählt in bestimmten Gruppe:

  1. Wie man dorthin Menge von Studenten statt mit Django ORM für jede Gruppe, so die Vorlage folgende Informationen übertragen:

    • Gruppenname: Mega-Nerds
    • Anzahl der Studenten: 8
    • Monitor: John Doe

    ...

    • Gruppenname: Nice guys
    • Anzahl der Studenten: 11
    • Monitor: John Appleseed
  2. Wie Daten über die Anzahl der Schüler an die entsprechende Gruppe übergeben werden.

Danke.

aktualisieren

Nach @Gocht Beratung, benutzte ich ManyToManyField, so meine models.py sieht nun

class Student(models.Model): 
    student_id = models.IntegerField(primary_key=True) 
    student_name = models.CharField(max_length=255, default='Василий Пупкин') 
    dob = models.DateField(max_length=8) 

    def __str__(self): 
     return self.student_name 


class Group(models.Model): 
    group_name = models.CharField(max_length=40, primary_key=True) 
    monitor = models.ForeignKey(Student) 
    students = models.ManyToManyField(Student, related_name='students') 

auch, wie vorgeschlagen, ich habe hinzugefügt Dekorateur Group Klasse:

@property 
def get_students_qty(self): 
    return self.students.all().count() 

so jetzt kann ich Anzahl der Schüler in jeder Gruppe erhalten, so:

Aber ich frage mich immer noch - ist es möglich, die Anzahl der Schüler in der Gruppe ohne Dekorateur zu bekommen?Immerhin hat Group Klasse students Feld ...

Antwort

1

Sie konnten die Zahl der Schüler in einer Gruppe wie diese:

group = ... # get a group 

n_students = Student_Group.objects.filter(group=group).count() 

Dann, da jedes Objekt Student_Group ein Schüler hat, n_students enthält die Anzahl der Schüler in der gegebenen Gruppe.

Um diese Nummer zu Ihrer Vorlage senden Sie es in Ihrem Kontext hinzufügen:

def group_list(request): 
    groups = Group.objects.all() 
    return render(request, 'groups/group_list.html', {'groups': groups, 'n_students': n_students}) 

Sie auch Dokumentation für ManyToMany Beziehungen sehen konnte, dass hier hilfreich sein könnte.

EDIT

Nehmen Sie sich Zeit Python's naming conventions zu überprüfen; Ihre Student_Group sollte StudentGroup sein.

Sie können eine Methode in Ihrem Modell erstellen, die Anzahl der Studenten in einer Gruppe zurück:

# models.py 
class Group(models.Model): 

    # fields 

    @property 
    def get_students_qty(self): 
     return self.student_group_set.all().count() 
     # Try with self.studentgroup_set.all().count() if the line 
     # above does not work 

dann in der Vorlage:

{% for group in groups %} 
    <p>{{ group.group_name }}</p> 
    <p>{{ group.monitor }}</p> 
    <p>{{ group.get_students_qty }}</p> 
{% endfor %} 
+0

Sorry, ich war nicht klar darüber, was erforderlich ist. Ich habe meine Frage bearbeitet, bitte beachten Sie, es zu überprüfen, vielen Dank –

+0

@mr_bulrathi bearbeitet – Gocht