Django loaddata с помощью Natural Keys не запрашивает правильный внешний ключ

Вот моя проблема. Я пытаюсь загрузить некоторые данные, которые имеют естественное ключевое отношение к другой модели.

Я модифицировал родительскую модель для генерации естественных ключей.

Я экспортировал данные из старой базы данных с помощью команды:

manage.py dumpdata resources.image -n --indent 4 > images.json 

Затем я попытался импортировать в новую базу данных с помощью команды:

 manage.py loaddata images.json 

На этом этапе я получаю сообщение об ошибке:

 IntegrityError: Problem installing fixtures: The row in table 'resources_image' with primary key '340' has an invalid foreign key: resources_image.voyage_id contains a value '41890' that does not have a corresponding value in voyage_voyage.id. 

Он пытается запросить voyage_voyage.id вместо voyage_voyage.voyage_id, как указано в функции get_by_natural_key. Я дважды проверял, и ключ в приборе находится в поле voyage_id. Ниже мой код и образец крепежа.

Родительская модель:

 # for parsing natural key class VoyageManager(models.Manager): def get_by_natural_key(self, voyage_id): return self.get(voyage_id=voyage_id) class Voyage(models.Model): # for parsing natural key objects = VoyageManager() voyage_id = models.IntegerField("Voyage ID (can be empty)", null=True, blank=True) # A WHOLE BUNCH OF FIELDS # generate natural key def natural_key(self): return (self.voyage_id) class Meta: ordering = ['voyage_id',] verbose_name = 'Voyage' verbose_name_plural = "Voyages" def __unicode__(self): return "Voyage #%s" % str(self.voyage_id) 

Модель ребенка:

 class Image(models.Model): voyage = models.ForeignKey(Voyage, null=True, blank=True) # MANY OTHER FIELDS class Meta: verbose_name = "Image" verbose_name_plural = "Images" ordering = ["date"] 

Светильник:

 { "pk": 340, "model": "resources.image", "fields": { "category": 56, "voyage": 41890, "date": 1873, "description": "blah blah blah", "language": " ", "creator": null, "title": "Catherine Zimmermann-Mulgrave, \nc.1873", "source": "blah blah blah", "ready_to_go": true, "file": "images/5AF81DA065049ACE0EC8E236C445F5BC.JPG", "order_num": 0 } } 

Итак, вот что я, наконец, понял

Эта функция ожидает, что вход поступает из кортежа:

 def get_by_natural_key(self, voyage_id): return self.get(voyage_id=voyage_id) 

Эта функция создает кортеж, когда задан флаг -natural

 def natural_key(self): return (self.voyage_id) 

Трюк ее заключается в том, что, когда у вас есть кортеж с одним элементом, он возвращается обратно к его исходному типу (str, int и т. Д.), Чтобы выделить один элемент кортежа, вам нужен конечный «,», поэтому исправление было:

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

вопрос остается

 { "pk": 41890, "model": "voyage.voyage", "fields": { ... } } 

находится в файле images.json, если нет, я думаю, вам придется каким-то образом включить его в дампе