Django:4个表中的select_related() / prefetch_related()

Posted

技术标签:

【中文标题】Django:4个表中的select_related() / prefetch_related()【英文标题】:Django: select_related() / prefetch_related() among 4 tables 【发布时间】:2021-09-06 15:19:29 【问题描述】:

我想查询 4 ​​个表(方向、层、金属堆栈和层)。除了我将在下面进一步解释的一部分之外,我已经完成了大部分查询。我需要一个包含列层、方向、堆栈名称、宽度的结果表。

在 sql 中,它会是这样的:

Class stack():
    id
    stackname

Class layers():
    id
    layers

Class directions():
    id
    directions

Class List():
    directions_id= models.ForeignKey(directions)
    layers_id= models.ForeignKey(layers)
    metalstack_id= models.ForeignKey(stack)
    width


SELECT layers, directions, stackname, width
FROM List 
JOIN layers l
ON l.id = List.layers_id
JOIN directions d
ON d.id = List.directions_id
JOIN stack s
ON s.id = List.metalstack_id;

下面的查询告诉我 layers_id、directions_id、stack_id、width 哪些值是正确的。但是,我不想获得 id,而是想要图层、方向和堆栈名称值。我尝试将其更改为 values("stackname","directions", "layers","pitch","space","width") 但它不起作用。

views.py

list= List.objects
.filter(metalstack_id__in=stackid)
.select_related('directions','layers','stackname')
.values("metalstack_id","directions_id",layers_id","width")

【问题讨论】:

【参考方案1】:

您可以根据需要尝试使用Django的first()last()查询集方法。

SomeModel.objects.filter(field_name=value).values("id", "name").first()

完整文档:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#first

【讨论】:

您知道一些可以更灵活地跨不同表进行查询的方法吗?如您所见,我的 models.py 之间有很多关系。跨 3 张桌子的可能性? 你可能想看看select_relatedprefetch_related

以上是关于Django:4个表中的select_related() / prefetch_related()的主要内容,如果未能解决你的问题,请参考以下文章

django: select_related() 在一个已经存在的对象上?

Django 管理员内联:select_related

带有字段比较结果的django注释查询集

orm的select_releated和prefetch_releated介绍

迭代 Django 中的相关对象:循环查询集或使用单行 select_related(或 prefetch_related)

SQL 从视图中的 4 个表中选择