Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加载包含自然关键点的Django夹具_Python_Django_Django Models_Natural Key - Fatal编程技术网

Python 加载包含自然关键点的Django夹具

Python 加载包含自然关键点的Django夹具,python,django,django-models,natural-key,Python,Django,Django Models,Natural Key,如何加载Django装置,以便通过自然关键点引用的模型不会与预先存在的记录冲突 我试图加载这样一个fixture,但是我的MySQL后端出现了IntegrityError,抱怨Django试图插入重复记录,这毫无意义 据我所知,Django的natural key特性,为了完全支持dumpdata和loaddata的使用,您需要在模型中定义一个natural\u key方法,并在模型管理器中定义一个get\u by\u natural\u key方法 例如,我有两个模型: class Perso

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

我试图加载这样一个fixture,但是我的MySQL后端出现了IntegrityError,抱怨Django试图插入重复记录,这毫无意义

据我所知,Django的natural key特性,为了完全支持dumpdata和loaddata的使用,您需要在模型中定义一个
natural\u key
方法,并在模型管理器中定义一个
get\u by\u natural\u 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", 
        }
    }
]
我希望能够将这个fixture加载到数据库的任何实例中,以重新创建记录,而不管它们是否已经存在于数据库中

但是,当我运行
python manage.py loaddata myfixture.json
时,我得到了错误:

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

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

实际上loaddata不应该与数据库中的现有数据一起工作,它通常用于模型的初始加载。
看看这个问题的另一种解决方法:

结果表明,解决方案需要对Django的
loaddata
命令进行一个非常小的补丁。因为Django开发人员不太可能接受这样的补丁,所以我已经在我的Django管理相关增强包中添加了一个补丁


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

是否将dumpdata与--natural选项一起使用?看起来fork链接不起作用,该代码是否仍然可用?