Django 3-table join orm

0md85ypi  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(106)
class Address(models.Model):
    ...

class Ship(models.Model):
    address = models.ForeignKey(Address, related_name='builtship')

class Photos(models.Model):
    ship = models.ForeignKey(Ship, related_name="photoship"

虽然我可以很容易地加入船舶与地址模型,因为它有其相关的名称内船舶,我不能加入它与照片,因为它没有它。
所以,加入地址我做了:
q1= ship.objects.select_related('address')
但我试了一整个星期天,我不能写它的ORM风格。我在2分钟内用原始SQL写了它,但我想知道如何在一个查询中将船舶与照片联系起来,以便我可以获取所有值并将其列在表中。
当然,我不能把照片的外键放在船上,因为每艘船都有很多可能的照片,所以它必须从照片到船。
我已经写了我试过的

o2g1uqev

o2g1uqev1#

只能沿着外键连接表,而不能反向连接表。原因是Django连接要求主模型中的每个对象与连接模型中的一个对象关联。
示例:
您可以加入“带照片的船舶”,因为每张照片都只与一艘船舶相关。但不是相反,因为每艘船都可能与许多照片相关。
因此,您可以重新构造查询以从照片开始:

Photos.objects.select_related("ship", "ship__address")

或者你可以使用prefetch_related()在一个查询中获取所有相关的对象:

Ship.objects.prefetch_related("photoship").select_related("address")

请参考Django文档了解预取的工作原理。有很多选择和一些警告。

相关问题