2011-02-03 21 views
5

Estoy tratando de seguir el código de la documentación de Django:Django - búsquedas inversas 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() 

Mi modelo es el siguiente:

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

Pero cuando llamo user.group_set. all() para una instancia de usuario dada, me sale un error de que no hay ningún atributo group_set

+1

¿Usted intentó 'trip_set' todavía? –

+0

Lo hice, pero supongo que no había reconstruido el DB así que no funcionó, ¡pero después de reconstruir el DB que lo hizo funcionar! ¿Puedo llamar esto desde una plantilla? Por ejemplo, si quiero ver si un viaje está en un "request.user.trip_set.all", ¿cómo lo haría? – JPC

+0

@jpc - Parece que está tratando de parlayar esta pregunta en el próximo número que está teniendo – MattoTodd

Respuesta

4

Primero, ¿está utilizando un modelo de paso? Has terminado allí, pero no lo tienes en la lista. Si no lo eres, no lo necesitas.

Yo añadiría un related_name, así:

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

, entonces debería ser capaz de llamar a:

user.user_trips.all() 

me llamaron 'user_trips' en lugar de 'viajes' becuase si ISN Es un nombre único que puede causar conflictos.

Si está utilizando el pase de modelos, que se vería más como esto:

#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() 

Entender que con esta manera, el TripReservation se refiere a una reserva Usuarios particular, al viaje, no todo el viaje, y la información sobre el viaje debe ser propiedades en el mismo modelo de viaje. Entonces, TripReservation.registered, es cuando ese usuario particular se registró para el viaje.

El usuario excursiones de búsqueda sería la misma:

user.user_trips.all() 
Cuestiones relacionadas