Django loaddata具有自然键和与自身的多对多关系

时间:2018-06-25 16:31:28

标签: python django

我有一个ManyToManyField"self"的模型。现在,我想将数据从本地复制到生产环境。为了做到这一点,我想将数据库中的所有条目转储到Fixture并将其加载到生产服务器上。因为该服务器已经包含数据,所以我使用自然键将其导出。导出运行正常,但是如果一个实例引用与夹具中该模型下方定义的同一模型的另一个实例的关系,则在loaddata期间会出错。

让我感到困惑的是:如果我不使用自然键,一切都会顺利进行。但这与生产中已经存在的数据相冲突。

请考虑以下示例:

from django.db import models


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=150, unique=True)
    friends = models.ManyToManyField("self", blank=True)

    def natural_key(self):
        return self.name,

要复制:

>>> python manage.py shell
>>> from relations.models import *
>>> person1 = Person.objects.create(name='foo')
>>> person2 = Person.objects.create(name='bar')
>>> person3 = Person.objects.create(name='baz')
>>> person2.friends.add(person2)
>>> person2.save()
>>> exit()
>>>
>>> python manage.py dumpdata relations.Person --natural-primary --natural-foreign > relations/fixtures/people.json

# change the database url to an empty database and run migrations

>>> python3 manage.py loaddata people
raises relations.models.DoesNotExist: Person matching query does not exist.

如果我省略了--natural-primary-natural-foreign,但遵循相同的步骤,则可以加载到新的数据库中。

有人可以解释为什么会发生这种不同的行为吗?

0 个答案:

没有答案