gpt4 book ai didi

python - 加载包含自然键的 Django Fixture

转载 作者:行者123 更新时间:2023-11-28 18:52:56 24 4
gpt4 key购买 nike

如何加载 Django fixture,以便通过自然键引用的模型不会与预先存在的记录冲突?

我正在尝试加载这样的固定装置,但我从我的 MySQL 后端收到 IntegrityErrors,提示 Django 试图插入重复记录,这没有任何意义。

据我了解Django的natural key特性,为了完全支持dumpdata和loaddata的使用,需要在model中定义一个natural_key方法,以及一个get_by_natural_key方法在模型的管理器中。

例如,我有两个模型:

class PersonManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)

class Person(models.Model):

objects = PersonManager()

name = models.CharField(max_length=255, unique=True)

def natural_key(self):
return (self.name,)

class BookManager(models.Manager):
def get_by_natural_key(self, title, *person_key):
person = Person.objects.get_by_natural_key(*person_key)
return self.get(title=title, person=person)

class Book(models.Model):

objects = BookManager()

author = models.ForeignKey(Person)

title = models.CharField(max_length=255)

def natural_key(self):
return (self.title,) + self.author.natural_key()
natural_key.dependencies = ['myapp.Person']

我的测试数据库已经包含一个示例 Person 和 Book 记录,我用它来生成夹具:

[
{
"pk": null,
"model": "myapp.person",
"fields": {
"name": "bob"
}
},
{
"pk": null,
"model": "myapp.book",
"fields": {
"author": [
"bob"
],
"title": "bob's book",
}
}
]

我希望能够获取此固定装置并将其加载到我的数据库的任何实例中以重新创建记录,无论它们是否已存在于数据库中。

但是,当我运行 python manage.py loaddata myfixture.json 时出现错误:

IntegrityError: (1062, "Duplicate entry '1-1' for key 'myapp_person_name_uniq'")

为什么 Django 试图重新创建 Person 记录而不是重新使用已经存在的记录?

最佳答案

事实证明,该解决方案需要对 Django 的 loaddata 命令打一个非常小的补丁。由于 Django 开发人员不太可能接受这样的补丁,我已经 forked it在我的各种 Django 管理相关增强包中。

关键代码更改(loaddatanaturally.py 的第 189-201 行)仅涉及调用 get_natural_key() 以查找循环内迭代反序列化数据的任何现有 pk对象。

关于python - 加载包含自然键的 Django Fixture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9509096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com