2011-02-03 14 views
5

Sto cercando di seguire il codice dalla documentazione Django:Django - ricerche inverse con ManyToManyField

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 


>>> ringo = Person.objects.create(name="Ringo Starr") 
>>> paul = Person.objects.create(name="Paul McCartney") 
>>> beatles = Group.objects.create(name="The Beatles") 
>>> m1 = Membership(person=ringo, group=beatles, 
...  date_joined=date(1962, 8, 16), 
...  invite_reason= "Needed a new drummer.") 
>>> m1.save() 
>>> beatles.members.all() 
[<Person: Ringo Starr>] 
>>> ringo.group_set.all() 

Il mio modello è simile al seguente:

class Trip(models.Model): 
    members = models.ManyToManyField(User,blank=True,null=True,through='TripReservation') 

Ma quando chiamo user.group_set. all() per una determinata istanza utente, viene visualizzato un errore che non esiste alcun attributo group_set

+1

Hai provato 'ancora trip_set'? –

+0

L'ho fatto ma suppongo di non aver ricostruito il DB in modo che non funzionasse, ma dopo aver ricostruito il DB che l'ha fatto funzionare! Posso chiamare questo da un modello? Per esempio se voglio vedere se un viaggio è in un "request.user.trip_set.all", come faccio? – JPC

+0

@jpc - sembra che tu stia cercando di riprodurre questa domanda nel prossimo numero che stai avendo – MattoTodd

risposta

4

In primo luogo, si utilizza un modello passante? Hai finito lì dentro, ma non lo hai elencato. Se non lo sei non ne hai bisogno.

Vorrei aggiungere un related_name, in questo modo:

class Trip(models.Model): 
    members = models.ManyToManyField(User,blank=True,null=True, related_name='user_trips') 

allora si dovrebbe essere in grado di chiamare:

user.user_trips.all() 

mi chiamavano 'user_trips' piuttosto che 'viaggi' becuase se isn 'un nome univoco può causare conflitti.

Se si utilizza un tramite modello, sarebbe un aspetto più simile a questo:

#User is defined in django.auth 

class Trip(models.Model): 
    members = models.ManyToManyField(User,blank=True,null=True, related_name='user_trips', through='TripReservation') 

class TripReservation(models.Model): 
    user = models.ForeignKey(User) 
    trip = models.ForeignKey(Trip) 
    registered = models.DateField() 

Capire che con questo modo, il TripReservation si riferisce ad una particolare prenotazione utenti al viaggio, non l'intero viaggio, e le informazioni sul viaggio dovrebbero essere proprietà sul modello Trip stesso. Quindi, TripReservation.registered, è quando quel particolare utente si è registrato per il viaggio.

L'utente viaggi di ricerca sarebbe la stessa:

user.user_trips.all() 
Problemi correlati