Django - 使用ManyToManyField进行反向查找 [英] Django - reverse lookups with ManyToManyField
问题描述
我试图遵循django文档中的代码:
I'm trying to follow the code from the django docs:
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()
我的模型看起来像这样:
My model looks like this:
class Trip(models.Model):
members = models.ManyToManyField(User,blank=True,null=True,through='TripReservation')
但是当我给给定的用户实例调用user.group_set.all()时,我收到错误没有属性group_set
But when I call user.group_set.all() for a given user instance, I get an error that there is no attribute group_set
推荐答案
首先,你是否使用直通模型?你已经在那里,但你没有列出。如果你不是你不需要它。
First, are you using a through Model? You have through in there, but you don't have it listed. If you aren't you don't need it.
我会添加一个相关的名称,像这样:
I would add a related_name, like so:
class Trip(models.Model):
members = models.ManyToManyField(User,blank=True,null=True, related_name='user_trips')
然后你应该可以调用:
user.user_trips.all()
我把它称为'user_trips'而不是'如果不是唯一的名称,可能会导致冲突,因此可能导致冲突。
I called it 'user_trips' rather than 'trips' becuase if it isn't a unique name it can cause conflicts.
如果您使用的是直通模型,那么它看起来更像是这样:
If you are using a through Model, it would look more like this:
#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,是那个特定的用户注册的行程。
Understand that with this way, the TripReservation refers to a particular Users reservation to the Trip, not the whole trip, and information about the trip should be properties on the Trip model itself. So, TripReservation.registered, is when that particular user registered for the trip.
用户跳闸查找将是一样的:
The user trips lookup would be the same:
user.user_trips.all()
这篇关于Django - 使用ManyToManyField进行反向查找的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!