Django 批量更新两个表的数据

Posted

技术标签:

【中文标题】Django 批量更新两个表的数据【英文标题】:Django bulk update with data two tables over 【发布时间】:2019-12-16 04:44:28 【问题描述】:

我想用两个表的数据批量更新一个表。已针对以下文档中提到的更简单情况给出了解决方案:

Entry.objects.update(headline=F('blog__name'))

有关该解决方案,请参阅

https://***.com/a/50561753/1092940

从示例展开,假设Entry 通过名为blog 的字段具有对Blog 的外键引用,并且Blog 通过名为@987654328 的字段具有对User 的外键引用@。我想要相当于:

Entry.objects.update(author_name=F('blog__author__username'))

与之前的解决方案一样,该解决方案预计使用SubQueryOuterRef

我在这里问的原因是因为我缺乏信心这个问题开始使用多个OuterRefs,并且对于它所指的外部引用产生了混淆。

【问题讨论】:

【参考方案1】:

我在这里问的原因是因为我对这个问题开始使用多个 OuterRef 的地方缺乏信心,并且对于它指的是哪个外部 ref 产生了混淆。

它确实不需要需要多个外部引用,你可以更新:

from django.db.models import OuterRef, Subquery

author_name = Author.objects.filter(
    blogs__id=OuterRef('blog_id')
).values_list(
    'username'
)[:1]

Entry.objects.update(
    author_name=Subquery(author_name)
)

因此,您在此处指定要查找具有相关BlogAuthor,其中id 等于Entryblog_id

【讨论】:

Author 回到Blog 的相关名称更可能是blogs,因为一个作者可以有多个博客。也就是说,我想我仍然可能会得到这个。仍在咀嚼它。 @AlanSE:如果没有指定related_name,则为blog__,否则为related_name__id(当然有related_name相关名称)。 一直以来我都认为嵌套的Subquerys 是必要的。在对我自己的问题(不再是一系列前向 ForeignKeys)以及您的示例进行更深入的调查之后,事实证明无论如何都没有必要。谢谢,已解决。

以上是关于Django 批量更新两个表的数据的主要内容,如果未能解决你的问题,请参考以下文章

两个表,根据条件批量更新其中一个表的某一列数据。(高分求救,在线等待。)

SQL两表关联批量更新一列数据下面有数据参考

mysql 3张表关联批量更新

oracle和mysql中update联表批量更新数据的区别

Django 批量更新/插入性能

mysql 根据一个表的数据更新另一个表