Как загрузить приспособление Django, чтобы модели, на которые ссылаются естественные ключи, не конфликтовали с уже существующими записями?
Я пытаюсь загрузить такое приспособление, но получаю IntegrityErrors отмой сервер MySQL, жалующийся на то, что Django пытается вставить дублирующиеся записи, что не имеет никакого смысла.
Как я понимаю, естественная ключевая функция Django, чтобы полностью поддерживать использование dumpdata и loaddata, вам нужно определить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']
Моя тестовая база данных уже содержитПример записи о человеке и книге, которую я использовал для создания прибора:
[
{
"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 вместо повторного использования уже существующей?