2017-08-12 1 views
0

ich ein RELATION Modell mit einem Fremdschlüssel für sich haben:Django Serialisierung natürliche Schlüssel verwenden: Fremdschlüssel zu dem gleichen Modell

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

Sobald es serialisiert produziert diese Art von 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" 
}] 

Dies ist ladbar logisch nicht von Django:

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

gibt es ein Mittel diese weise zu verwalten?

+0

Wahrscheinlich nicht zu Ihrem Problem zu tun hat, sondern die Fremdschlüssel sollten 'definiert werden' 'self'''. Siehe [doc] (https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey). – mimo

+0

Tatsächlich löst es das Problem nicht. Aber danke für diese Bemerkung. Die Verwendung von "self" ist interessant, wenn die Unterklasse des Modells verwendet wird. –

Antwort

0

Ich kam mit einer ziemlich hässlichen Lösung (ich würde mich freuen, wenn jemand mit einem besseren kommt).

I erzeugen das Gerät zuerst:

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

Dann benutze ich einige UNIX Magie "Selbst" Beziehungen zu entfernen:

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 

Für die Neugierigen zu den UNIX-Magie, übersetzen ich Zeilenendmarke mit ein anderes beliebiges Zeichen, weil sed keine regulären Ausdrücke mit mehreren Zeilen ausführen kann.

Dann kann ich die beiden Befestigungen mit der norel Halterung lädt zuerst:

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