python - 带有自然键的Django loaddata,没有查询正确的外键

  显示原文与译文双语对照的内容

这是我的问题。我试图加载一些与它的他模型有自然关键关系的数据。

我修改了父模型以生成自然键。

我使用以下命令导出了旧数据库中的数据:


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 而不是get_by_natural_key函数中指定的voyage_voyage.voyage_id 。 我检查过了,夹具里的钥匙在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)

当你拥有一个元元素时,它将返回到原始类型( 结构,int 等等 ) 之前,你需要一个尾随",":


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

作者:

问题是


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

在 images.json 文件里如果不是我想你必须把它包括在转储中

作者:
...