【发布时间】:2021-02-22 15:01:00
【问题描述】:
在 Django 中,我经常将模型装置从一个数据库复制到另一个数据库。我的模型在序列化过程中使用natural_keys(尽管我不确定这是否相关)。如何确保一个数据库中已更新的实例不会插入到另一个数据库中?
考虑以下代码:
models.py:
class AuthorManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Author(models.Model):
objects = AuthorManager()
name = models.CharField(max_length=100)
def natural_key(self):
return (self.name,)
现在,如果我创建一个名为“William Shakespeare”的作者并通过python manage.py dumpdata --natural_keys 将其转储到固定装置,我将使用以下类型的文件结束:
[
{
"model": "myapp.author",
"fields": {
"name": "Wiliam Shakespeare"
}
}
]
我可以将它加载到另一个数据库中,它将创建一个名为“William Shakespeare”的新作者。
但是,如果我在原始数据库中将该作者重命名为“Bill Shakespeare”并重新创建夹具并将其加载到另一个数据库中,那么它将创建另一个 new 作者命名为“Bill Shakespeare”,而不是更新现有Author 的名字。
关于如何解决这个问题的任何想法?
【问题讨论】:
-
想到的一个想法是使用
uuids作为 natural_key(或者实际上只是作为id字段本身)。 -
呃,自然键的重点是不要使用无意义的键。