JPC*_*JPC 6 python django django-models
我正在尝试遵循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()
Run Code Online (Sandbox Code Playgroud)
我的模型看起来像这样:
class Trip(models.Model):
    members = models.ManyToManyField(User,blank=True,null=True,through='TripReservation')
Run Code Online (Sandbox Code Playgroud)
但是当我为给定的用户实例调用user.group_set.all()时,我得到一个错误,即没有属性group_set
首先,您正在使用直通模型吗?您已经通过那里,但没有列出它。如果您不是,则不需要它。
我将添加一个related_name,如下所示:
class Trip(models.Model):
    members = models.ManyToManyField(User,blank=True,null=True, related_name='user_trips')
Run Code Online (Sandbox Code Playgroud)
然后,您应该可以致电:
user.user_trips.all()
Run Code Online (Sandbox Code Playgroud)
我将其称为“ 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()
Run Code Online (Sandbox Code Playgroud)
请理解,通过这种方式,TripReservation引用了特定的用户对Trip的保留,而不是整个行程,并且有关行程的信息应该是Trip模型本身的属性。因此,TripReservation.registered是该特定用户注册旅行的时间。
用户行程查找将是相同的:
user.user_trips.all()
Run Code Online (Sandbox Code Playgroud)