2014-01-16 39 views
2

这是我的问题。我正在尝试加载一些与另一个模型具有自然关系的数据。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而不是voyage_voyage.voyag e_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 
    } 
} 

回答

4

所以这里就是我终于想通了

该函数要求输入来自一个元组:

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,) 
0

问题是阉

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

是images.json文件,如果不是我想你必须把它列入转储莫名其妙

+0

** voyage.voyage **模型已经加载。对于此特定对象,41890位于voyage_id字段中,而不是voyag.id字段。我认为自然键的全部概念是,对于现有数据,pk可以是(通常不是静态值),因此可以使用另一个字段来标识将子记录与父项关联的记录。 – Alex