Django - обратный поиск с ManyToManyField - PullRequest
6 голосов
/ 03 февраля 2011

Я пытаюсь следовать коду из документации django:

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

Моя модель выглядит так:

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

Но когда я вызываю user.group_set.all () для данного пользовательского экземпляра, я получаю сообщение об ошибке, что атрибут group_set отсутствует

1 Ответ

8 голосов
/ 03 февраля 2011

Во-первых, вы используете сквозную модель? Вы прошли через там, но у вас нет этого в списке. Если это не так, вам это не нужно.

Я бы добавил related_name, например, так:

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

Тогда вы сможете звонить:

user.user_trips.all()

Я назвал его «user_trips», а не «trips», потому что если это не уникальное имя, это может вызвать конфликты.

Если вы используете сквозную модель, она будет выглядеть примерно так:

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

Следует понимать, что в этом случае TripReservation относится к конкретному бронированию пользователей в Trip, а не ко всей поездке, и информация о Trip должна быть указана в самой модели Trip. Итак, TripReservation.registered - это когда этот конкретный пользователь зарегистрировался для поездки.

Поиск пользовательских команд будет таким же:

user.user_trips.all()
...