当你有两个模型通过 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
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