Skip to content

Instantly share code, notes, and snippets.

@dustinfarris
Created September 14, 2013 23:47
Show Gist options
  • Save dustinfarris/6566739 to your computer and use it in GitHub Desktop.
Save dustinfarris/6566739 to your computer and use it in GitHub Desktop.
dealing with reverse generic relations
import ast
from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers
from addresses.serializers import AddressSerializer
from users import models
class AddressesField(serializers.RelatedField):
read_only = False
def from_native(self, data):
return ast.literal_eval(data)
def to_native(self, value):
return AddressSerializer(value).data
class UserSerializer(serializers.ModelSerializer):
addresses = AddressesField(many=True, required=False)
class Meta:
model = models.User
fields = ('id', 'username', 'first_name', 'last_name', 'email', 'phone', 'addresses')
def restore_object(self, attrs, instance=None):
self._addresses = attrs.pop('addresses')
return super(UserSerializer, self).restore_object(attrs, instance)
def save_object(self, obj, **kwargs):
super(UserSerializer, self).save_object(obj, **kwargs)
content_type = ContentType.objects.get_for_model(obj)
for address in self._addresses:
address.update({
'content_type': content_type,
'object_id': obj.id,
})
obj.addresses.get_or_create(**address)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment