Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当django中有两个模型通过foreignkey连接时,是否需要进行连接?_Python_Django_Orm_Foreign Key Relationship - Fatal编程技术网

Python 当django中有两个模型通过foreignkey连接时,是否需要进行连接?

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

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'))
我在rooms
Venue
属性的
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子句。