diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2008-06-09 14:03:35 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2008-06-09 14:03:35 +0000 |
| commit | 12716794dbcf2e1bf7a07bd18dfc0ae24be4e6f8 (patch) | |
| tree | ebeae5a3a44e340afd6def0479c44b58d2548232 /docs | |
| parent | 1426c2451756572fccaf264ed2b752553b1c7933 (diff) | |
Fixed #7350, #7202 -- Fixed serialization for multi-model inheritance, which had multiple problems:
* Serializers were including all superclass fields in their output. Now only local fields are included.
* Implicit OneToOne primary keys were not correctly added to the metamodel, so they were always marked to be serialized, even though they were primary
* Model saving was too aggressive about creating new parent class instances during deserialization. Raw save on a model now skips saving of the parent class.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@7600 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/serialization.txt | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/docs/serialization.txt b/docs/serialization.txt index 8a672d8b8a..2a3e7038da 100644 --- a/docs/serialization.txt +++ b/docs/serialization.txt @@ -63,6 +63,41 @@ be serialized. doesn't specify all the fields that are required by a model, the deserializer will not be able to save deserialized instances. +Inherited Models +~~~~~~~~~~~~~~~~ + +If you have a model that is defined using an `abstract base class`_, you don't +have to do anything special to serialize that model. Just call the serializer +on the object (or objects) that you want to serialize, and the output will be +a complete representation of the serialized object. + +However, if you have a model that uses `multi-table inheritance`_, you also +need to serialize all of the base classes for the model. This is because only +the fields that are locally defined on the model will be serialized. For +example, consider the following models:: + + class Place(models.Model): + name = models.CharField(max_length=50) + + class Restaurant(Place): + serves_hot_dogs = models.BooleanField() + +If you only serialize the Restaurant model:: + + data = serializers.serialize('xml', Restaurant.objects.all()) + +the fields on the serialized output will only contain the `serves_hot_dogs` +attribute. The `name` attribute of the base class will be ignored. + +In order to fully serialize your Restaurant instances, you will need to +serialize the Place models as well:: + + all_objects = list(Restaurant.objects.all()) + list(Place.objects.all()) + data = serializers.serialize('xml', all_objects) + +.. _abstract base class: http://www.djangoproject.com/documentation/model-api/#abstract-base-classes +.. _multi-table inheritance: http://www.djangoproject.com/documentation/model-api/#multi-table-inheritance + Deserializing data ------------------ |
