【问题标题】:Django - reverse lookups with ManyToManyFieldDjango - 使用 ManyToManyField 进行反向查找
【发布时间】:2011-02-03 01:15:29
【问题描述】:

我正在尝试遵循 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

【问题讨论】:

  • 我做了,但我想我没有重建数据库,所以它没有工作,但是在重建让它工作的数据库之后!我可以从模板中调用它吗?例如,如果我想查看行程是否在“request.user.trip_set.all”中,我该怎么做?
  • @jpc - 听起来你正试图将这个问题放到你遇到的下一个问题中
  • 我应该开始一个新问题
  • @jpc - 如果有人遇到同样的问题,如果答案隐藏在不相关问题的 cmets 中,将无济于事。如果您确实需要另一个问题的答案。先看看有没有回复,没有回复再发帖。

标签: python django django-models


【解决方案1】:

首先,您使用的是直通模型吗?你已经通过了,但你没有列出它。如果你不是,你就不需要它。

我会添加一个相关名称,如下所示:

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 指的是特定用户对旅行的预订,而不是整个旅行,有关旅行的信息应该是旅行模型本身的属性。因此,TripReservation.registered 是该特定用户注册旅行的时间。

用户行程查找将是相同的:

user.user_trips.all()

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 2012-02-14
    • 2011-10-01
    • 2014-02-16
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2020-09-09
    • 2019-07-13
    相关资源
    最近更新 更多