当你有两个模型通过 django 中的外键连接时,你需要做一个连接吗?

When you have two models connected by a foreignkey in django do you need to do a join?

Django 文档没有清楚地说明这一点,而且它越来越烦人。

观察以下模型:

# models
class Venue(models.Model):
    name = models.CharField(max_length=150, blank=False)
    description = models.CharField(max_length=1000)
    image = models.ImageField(upload_to=imgUnique('venueMedia/venueImages'))
    streetAddress= models.CharField(max_length=100)
    city = models.CharField(max_length=100, blank=False)
    state = models.CharField(max_length=100, blank=False)


class Room(models.Model):
    name = models.CharField(max_length=150, blank=False)
    venue = models.ForeignKey(Venue, related_name='rooms', on_delete=models.CASCADE)
    description = models.CharField(max_length=1000)
    standingCapacity = models.IntegerField
    seatedCapacity = models.IntegerField
    image = models.ImageField(upload_to=imgUnique('venueMedia/venueImages'))

我在房间 venue 属性 的 Room 模型中与 Venue 有外键关系。

我需要加入那些表吗?或者 Venue.objects.all() 会自动为我做这件事吗?如果没有,我有原始的 sql,如下所示,这项工作是否有效:

 venueList = Venue.objects.raw('''SELECT *
                              FROM venue_Venue
                              INNER JOIN venue_Room
                              ON venue_Venue_id=venue_Room_id''')

如果不是那样,那么我知道有一个 select_related() 方法,我的理解是我会执行以下操作:

Venue.objects.all().select_related('Room') 

我们能说清楚吗?如您所见,我做了很多研究,但仍然感到困惑

select_related

select_related 可以在你想 select 通过 ForeignKey 或 OneToOne 字段连接的对象时使用,更准确地说,你只能在你想 select 单个连接的对象时使用它目的。 select_related 带一个参数可以用它来查找 related_field。模型属性中指定的参数 related_name='rooms' 负责设置相关名称。 select_related 方法搜索这些相关名称,如果找到匹配项,则它 returns 为您提供相关对象。这一行

Venue.objects.all().select_related('Room')  

会导致查找错误,因为您没有任何相关名称 'Room' 但您有 room 因此您还需要注意区分大小写。下面一个就可以了。

Venue.objects.all().select_related('room')

如上所述select_related只能用于select单个相关对象。如果您希望获取多个相关对象,例如 ManyToManyField,请使用 prefetch_related