2017-08-12 19 views
0

同じモデルへの外部キー:Djangoのシリアライズ:私は自分自身への外部キーを持つRELATIONTYPEモデルを持っている

[{ 
    "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" 
}] 

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のこの種を生成しますこれは論理的にDjangoによってロードできません:

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

これを賢く管理する手段はありますか?

+0

それから私は、最初のnorelフィクスチャを持つ2つの器具を読み込むことができます。 [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の魔法を使用します。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 

、私は改行文字がで翻訳しsedは複数行の正規表現を行うことができないので、別の任意の文字。おそらく、あなたの問題に関連しているが、外部キーは `` 'self'``を使用して定義されるべきではない

./manage.py loaddata fixtures/initial_relation_type-norel.json 
./manage.py loaddata fixtures/initial_relation_type.json 
関連する問題