Python 当django中有两个模型通过foreignkey连接时,是否需要进行连接?
Django文档并没有明确说明这一点,而且它越来越令人讨厌 请注意以下型号:Python 当django中有两个模型通过foreignkey连接时,是否需要进行连接?,python,django,orm,foreign-key-relationship,Python,Django,Orm,Foreign Key Relationship,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/venu
# 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'))
我在roomsVenue
属性的Room
模型中与Venue
有外键关系
我需要加入那些表吗?或者,vention.objects.all()
会自动为我这样做吗?如果没有,我的原始sql如下所示:
venueList = Venue.objects.raw('''SELECT *
FROM venue_Venue
INNER JOIN venue_Room
ON venue_Venue_id=venue_Room_id''')
如果不是这样,那么我知道有一个select\u related()
方法,我的理解是我将执行以下操作:
Venue.objects.all().select_related('Room')
我们能说清楚吗?正如你所看到的,我做了很多研究,但仍然感到困惑选择相关的 当您想要选择通过ForeignKey或OneToOne字段连接的对象时,可以使用select_related,更准确地说,只有当您想要选择单个连接的对象时,才可以使用该选项。选择相关参数可以使用它查找相关字段。模型属性中指定的参数
related_name='rooms'
负责设置相关名称。select_related method搜索这些相关名称,如果找到匹配项,则返回相关对象。这条线
Venue.objects.all().select_related('Room')
将导致查找错误,因为您没有任何相关名称“Room”,但您有Room
,因此您还需要注意区分大小写。低于一个就行了
Venue.objects.all().select_related('room')
如上所述,select_related只能用于选择单个相关对象。如果您希望获取多个相关对象,如ManyToManyField,则使用venuel.objects.all()将包含房间对象。您不需要编写原始查询或其他内容。例如
venue=venue.objects.all()
nd如果您想获得房间名称,您可以使用地点.房间.名称
。如果不让我知道,这将起作用。谢谢,伙计,这很好,但要清楚,我不需要使用选择相关。正如@Abi上面所说的,vention.objects.all()将获取房间对象。你告诉我,如果我有另一个模型连接到场馆,比如说设施,但只想要房间模型,而不是两者。然后我会使用select related。在这种情况下,我可以使用select related,但是因为我只有一个连接的表,这是不必要的对吗?是的,这里没有必要使用related_字段,只是为了回答问题,我尝试解释了相关的_字段。它们也可以用于你提到的其他情况。也许你可以补充说,select\u related
是一种性能优化。它不会影响queryset中过滤的对象,但会影响这些对象的外观。在SQL术语中,它将联接模型的字段添加到语句的SELECT部分,但不改变JOIN或WHERE子句。