在 Django 中使用 natural_keys 时,如何区分创建和更新?



在Django中,我经常将模型固定装置从一个数据库复制到另一个数据库。我的模型在序列化期间使用natural_keys(尽管我不确定这是否相关(。如何确保一个数据库中已更新的实例不会插入到另一个数据库?

考虑以下代码:

型号.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,)

现在,如果我创建一个名为";威廉·莎士比亚;并通过python manage.py dumpdata --natural_keys将其转储到固定装置,我将使用以下类型的文件:

[
{
"model": "myapp.author",
"fields": {
"name": "Wiliam Shakespeare"
}
}
]

我可以将其加载到另一个数据库中,它将创建一个名为"的作者;威廉·莎士比亚";。

但是,如果我将该作者重命名为";比尔·莎士比亚;并重新创建夹具并将其加载到另一个数据库中,然后它将创建另一个新的作者;比尔·莎士比亚;而不是更新现有Author的名称。

关于如何处理这个问题,有什么想法吗?

您使用fixture的目的不是同步数据库。它是为填充空数据库而设计的。特别地;删除";不能在fixture中表示。基于自然键的更新可以表示为插入+删除。

现在,您可以通过简单地不使用自然键来解决这个问题,但数据库之间的主键必须相同。如果目标数据库接收到来自另一个源的插入,则这是一个问题,因为更新将发生在错误的对象上。

简而言之:使用同步/复制工具来同步数据库,使用fixture进行迁移和测试。尝试使用fixture进行同步很容易出错。

相关内容

  • 没有找到相关文章

最新更新