django - 在ManyToMany和ForeignKey中使用related_name

时间:2015-05-22 10:23:24

标签: python django foreign-keys many-to-many

我有两个模型(也使用auth.user)。 auth.user Ride 模型之间有两个关系, Ride 模型和目的地模型有两者之间的关系。

Ride拥有多个中间目的地和一个最终目的地。 Ride有许多乘客和一个司机。

class Destination(models.Model):
    name=models.CharField(max_length=30)

class Ride(models.Model):
    driver = models.ForeignKey('auth.User', related_name='rides_as_driver')
    destination=models.ForeignKey(Destination)
    leaving_time=models.DateTimeField()
    num_of_spots=models.IntegerField()
    passengers=models.ManyToManyField('auth.User', related_name="rides_as_passenger")
    mid_destinations=models.ManyToManyField(Destination)

我试图完全理解related_name属性的含义。我读了很多关于它的但仍然不确定......

另外,我读到如果模型之间有两个关系,我必须使用related_name。

有人可以向我解释一下:

  • related_name属性究竟是什么?我什么时候使用它?
  • 我何时以及在哪里使用rides_as_driver和rides_as_passenger?
  • 我应该在目的地的字段中放置什么? (中间目的地和最终目的地)?

非常感谢!

2 个答案:

答案 0 :(得分:3)

顾名思义,这是您从相关模型访问模型时使用的名称。因此,如果您有一个用户实例,my_user.rides_as_driver.all()将为您提供ride.driver == my_user所有的游乐设施,my_user.rides_as_passenger.all()将为您提供ride.passengers包含my_user的所有游乐设施}。

答案 1 :(得分:2)

由于您已经在documentation上阅读了相关内容,我将举一个简单的示例。

您有一个驱动程序,并且您想获得驱动程序的所有相关游乐设施的列表。例如:

>>> driver = User.objects.first()
  • 未指定related_name

    >>> driver.ride_set.all()
    
  • 在代码中指定related_name

    >>> driver.rides_as_driver.all()