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

lmr*_*391 5 python django

ManyToManyField我有一个带有to的模型"self"。现在我想将数据从本地复制到生产环境。为了做到这一点,我想将数据库中的所有条目转储到固定装置并将其加载到生产服务器上。因为该服务器已经包含数据,所以我使用自然键导出它们。导出运行良好,但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,
Run Code Online (Sandbox Code Playgroud)

重现:

>>> 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.
Run Code Online (Sandbox Code Playgroud)

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

有人可以解释为什么会出现不同的行为吗?