2017-08-12 40 views
0

我有一个外键RelationType模型本身:Django的序列化:外键同型号

class TypeManager(models.Manager): 
    def get_by_natural_key(self, slug): 
     return self.get(slug=slug) 

class RelationType(models.Model): 
    name = models.CharField(_(u"Name"), max_length=100) 
    slug = models.SlugField(_(u"Slug"), max_length=100, unique=True) 
    inverse_relation = models.ForeignKey(
     'RelationType', verbose_name=_(u"Inverse relation"),   
     blank=True, null=True) 
    objects = TypeManager() 

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

一旦连载它会产生这样的JSON的:

[{ 
    "fields": { 
     "name": "Has got", 
     "inverse_relation": [ 
      "is_in" 
     ], 
     "slug": "has_got" 
    }, 
    "model": "myapp.relationtype" 
}, 
{ 
    "fields": { 
     "name": "Is in", 
     "inverse_relation": [ 
      "has_got" 
     ], 
     "slug": "is_in" 
    "model": "myapp.relationtype" 
}] 

这在逻辑上不适合Django:

DeserializationError: Problem installing fixture 'myfixture.json': RelationType matching query does not exist. 

有没有一种方法可以明智地管理这个问题?

+0

也许不相关的问题,但外键应该使用'''self'''定义。请参阅[doc](https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey)。 – mimo

+0

确实没有解决问题。但是,谢谢你的评论。在使用模型的子类时,使用'self''很有趣。 –

回答

0

我想出了一个非常丑陋的解决方案(我会很高兴,如果有人来一个更好的一个)。

我第一次产生夹具:

./manage.py dumpdata --indent 4 --natural-primary --natural-foreign \ 
    myapp.relationtype > fixtures/initial_relationtypes.json 

然后我用一些UNIX魔法删除“自我”的关系:

cat fixtures/initial_relation_types.json | tr '\n' '\r' | \ 
    sed -e 's/"inverse_relation": *\[\r *\"[-_a-z0-9]*\" *\r *\]/"inverse_relation": null/g' | \ 
    tr '\r' '\n' > fixtures/initial_relation_type-norel.json 

对于好奇UNIX魔术,我翻译了新行字符另一个任意字符,因为sed不能做多行正则表达式。

然后,我可以用norel夹具首先加载两场比赛:

./manage.py loaddata fixtures/initial_relation_type-norel.json 
./manage.py loaddata fixtures/initial_relation_type.json