2013-01-13 11 views
8

modello:django di accesso a molti prima per molti campi della tabella creati

class Subjects (models.Model): 
    name = models.CharField(max_length=100) 
    places = models.CharField(max_length=100) 


class Student (models.Model): 
    name = models.CharField(max_length=40) 
    lastname = models.CharField(max_length=80) 
    subjects = models.ManyToManyField(Subjects, blank=True) 

Django crea appname_student_subjects quando uso modello di cui sopra.

tavolo appname_student_subjects guarda per esempio, in questo modo:

id | student_id | subjects_id 
----------------------------------------- 
1 | 1   | 10 
2 | 4   | 11 
3 | 4   | 19 
4 | 5   | 10 
... 
~1000 

Come posso accedere campo subjects_id e contare quante volte esiste subjects_id nella tabella qui sopra (e poi fare qualcosa con esso). Ad esempio: se il soggetto con ID 10 esiste due volte il modello visualizza 2. So che dovrei usare "len" con risultato ma non so come accedere al campo subject_id. Con le chiavi esterne che sto facendo in questo modo in un ciclo for:

results_all = Students.objects.filter(subject_id='10') 
result = len(results_all) 

e passare risultato al modello e visualizzarlo all'interno di un ciclo, ma non è una chiave esterna in modo che non funziona.

risposta

14

È possibile accedere direttamente alla tabella Through.

num = (Students.subjects # M2M Manager 
       .through # subjects_students through table 
       .objects # through table manager 
       .filter(student_id=10) # your query against through table 
       .count()) 
+0

Ecco una nota su un piccolo dettaglio, che può risparmiare un po 'altro lettore po' di tempo, un giorno: 'Students.subjects.through' funziona, ma' Subjects.student_set.through' non funziona. Questo è del tutto comprensibile dal punto di vista del design, ma nella vita reale le persone dimenticano quale sia l'insieme correlato in primo luogo e non hanno idea di cosa stia dicendo il messaggio di errore. – AlanSE

Problemi correlati