【发布时间】:2020-07-08 11:27:22
【问题描述】:
我有一个看起来像这样的模型:
class Keyword(models.Model):
name = models.CharField(unique=True)
class Post(models.Model):
title = models.CharField()
keywords = models.ManyToManyField(
Keyword, related_name="posts_that_have_this_keyword"
)
现在我想将 错误命名 Keyword 的所有 Posts 迁移到一个新的正确命名 Keyword。并且有多个错误命名Keywords。
我可以执行以下操作,但会导致大量 SQL 查询。
for keyword in Keyword.objects.filter(is_wrongly_named=True).iterator():
old = keyword
new, _ = Keyword.objects.get_or_create(name='some proper name')
for note in old.notes_that_have_this_keyword.all():
note.keywords.add(old)
old.delete()
有没有办法在最小化执行的 SQL 查询的同时实现这一点?
我更喜欢 Django ORM 解决方案而不是原始 SQL 解决方案,因为我直接进入 Django ORM 没有深入研究 SQL,对 SQL 不是很熟悉。
谢谢。
【问题讨论】:
-
你不能只重命名关键字吗?
-
@IainShelvington 我不能,因为已经存在带有
'some proper name'的关键字。简单地重命名它们会导致IntegrityError。 -
这能回答你的问题吗? How to update manytomany field in Django?
-
@IainShelvington 它看起来像我在这个问题中发布的代码。对我没有帮助。