## Models class Place(models.Model): name = models.CharField(max_length=255, blank=True) slug = models.SlugField(max_length=255, null=True, blank=True) class PlaceAcronym(models.Model): place = models.ForeignKey('Place', related_name="acronyms") acronym = models.CharField(_("acronym"), max_length=128, help_text=_("An acronym for the place, e.g. 'PV'") ) ## Detail View class PlaceDetail(generics.RetrieveUpdateDestroyAPIView): model = Place serializer_class = PlaceSerializer ## Serializers class AcronymSerializer(serializers.ModelSerializer): def get_identity(self, data): return data def to_native(self, value): return '%s' % (value.acronym, ) def from_native(self, data, files): value = super(AcronymSerializer, self).from_native({'acronym': data}, files) return value class Meta: model = PlaceAcronym fields = ('acronym',) class PlaceSerializer(serializers.ModelSerializer): acronyms = AcronymSerializer(many=True, allow_add_remove=True) class Meta: model = Place view_name = 'maps:place-detail' lookup_field = 'slug' _self = serializers.HyperlinkedIdentityField(view_name='maps:place-detail') fields = ( '_self', 'slug', 'name', 'acronyms', )