在 Django 中使用 natural_keys 时,如何区分创建和更新?
When using natural_keys in Django, how can I distinguish between creates & updates?
在 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”并重新创建夹具并将其加载到other database 然后它将创建另一个 new Author named "Bill Shakespeare" 而不是更新 existing Author
的名字。
关于如何处理这个问题有什么想法吗?
您使用固定装置的目的不是为了:同步数据库。它是为填充空数据库而设计的。特别是,“删除”不能在fixtures中表达。基于自然键的更新可以表示为插入+删除。
现在您可以通过不使用自然键来解决这个问题,但是数据库之间的主键必须相同。如果目标数据库从另一个源接收插入,那么这是一个问题,因为更新将发生在错误的对象上。
简而言之:使用synchronization/replication工具同步数据库,使用fixtures进行迁移和测试。尝试使用固定装置进行同步很容易出错。
在 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”并重新创建夹具并将其加载到other database 然后它将创建另一个 new Author named "Bill Shakespeare" 而不是更新 existing Author
的名字。
关于如何处理这个问题有什么想法吗?
您使用固定装置的目的不是为了:同步数据库。它是为填充空数据库而设计的。特别是,“删除”不能在fixtures中表达。基于自然键的更新可以表示为插入+删除。
现在您可以通过不使用自然键来解决这个问题,但是数据库之间的主键必须相同。如果目标数据库从另一个源接收插入,那么这是一个问题,因为更新将发生在错误的对象上。
简而言之:使用synchronization/replication工具同步数据库,使用fixtures进行迁移和测试。尝试使用固定装置进行同步很容易出错。