Django - 使用ManyToManyField进行反向查找 [英] Django - reverse lookups with ManyToManyField

查看:149
本文介绍了Django - 使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆