title: SerializerClass field on Serializer save from primary key
body: <p>I am working developing an API with Django-rest-framework and consuming it from a web app. It has a Physician Model  with a Fk from the django.auth User model. I want to post from a form to the Physician Model but the serializer returns this message:</p>
  
  <blockquote>
    <p>{"user":{"non_field_errors":["Invalid data. Expected a dictionary, but got unicode."]}}</p>
  </blockquote>
  
  <p>I am sending the primary key of the user object. Which is the right (or just one way) to store a foreign key on DRF. I have tried overriding get_validation_exclusions on the serializer and overriding perform_create method on the viewset.</p>
  
  <p>The api and the web app are decouple. The API is developed with django and the web app with angularjs. </p>
  
  <p>My model</p>
  
  <pre><code>class Physician(models.Model):
      medical_office_number = models.CharField(max_length = 15)
      fiscal_id_number = models.CharField(max_length = 20)
      user = models.OneToOneField(User)
  
      def __unicode__(self):
          return self.user.first_name +' '+ self.user.last_name
  </code></pre>
  
  <p>Serializer:</p>
  
  <pre><code>class PhysicianSerializer(serializers.ModelSerializer):
      user = AccountSerializer()
      class Meta:
          model = Physician
          fields = ('id', 'user', 'medical_office_number', 'fiscal_id_number')
          read_only_fields = ('id')
          depth = 1
      def get_validation_exclusions(self, *args, **kwargs):
          exclusions = super(PhysicianSerializer, self).get_validation_exclusions()
          return exclusions + ['user']
  </code></pre>
  
  <p>*Edit
  This is my account serializer, which is based on this implementation and with the @Kevin Brown suggestion</p>
  
  <pre><code>class PrimaryKeyNestedMixin(serializers.RelatedField, serializers.ModelSerializer):
  
      def to_internal_value(self, data):
          return serializers.PrimaryKeyRelatedField.to_internal_value(self, data)
      def to_representation(self, data):
          return serializers.ModelSerializer.to_representation(self, data)
  
  class AccountSerializer(PrimaryKeyNestedMixin):
      password = serializers.CharField(write_only=True, required=False)
      confirm_password = serializers.CharField(write_only=True, required=False)
  
      class Meta:
          model = Account
          fields = ('id', 'email', 'username', 'created_at', 'updated_at',
                    'first_name', 'last_name', 'password',
                    'confirm_password', 'is_admin',)
          read_only_fields = ('created_at', 'updated_at',)
  </code></pre>
  
  <p>Viewset</p>
  
  <pre><code>class AccountViewSet(viewsets.ModelViewSet):
      lookup_field = 'username'
      queryset = Account.objects.all()
      serializer_class = AccountSerializer
  </code></pre>
  
  <p>When I try to serializer this object, it triggers an error.</p>
  
  <p>So I can post any user from the <code>&lt;select&gt;</code> element. But I can't verify the solution. Something I am missing?</p>
  
  <p>Error Stacktrace</p>
  
  <pre><code>TypeError at /api/v1/accounts/
  
  __init__() takes exactly 1 argument (5 given)
  
  Exception Location:     /home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/rest_framework/relations.py in many_init, line 68
  Python Executable:  /home/jlromeroc/workspace/asclepios/venv/bin/python
  Python Version:     2.7.3
  
  File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 111. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view 57. return view_func(*args, **kwargs)
  File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/rest_framework/viewsets.py" in view 85. return self.dispatch(request, *args, **kwargs)
  File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 407. response = self.handle_exception(exc) File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 404. response = handler(request, *args, **kwargs)
  File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/rest_framework/mixins.py" in list 45. serializer = self.get_serializer(instance, many=True)
  File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/rest_framework/generics.py" in get_serializer 90. instance, data=data, many=many, partial=partial, context=context File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/rest_framework/relations.py" in __new__ 48. return cls.many_init(*args, **kwargs)
  File "/home/jlromeroc/workspace/asclepios/venv/local/lib/python2.7/site-packages/rest_framework/relations.py" in many_init 68. list_kwargs = {'child_relation': cls(*args, **kwargs)}
  
  Exception Type: TypeError at /api/v1/accounts/
  Exception Value: __init__() takes exactly 1 argument (5 given)
  </code></pre>
  
  <p>Edit**
  I have opted to override the create function on the viewset and include the object in the request, so it can be validated, but then, the serializer tries to insert a new object for the Account model. How can I prevent this behaviour? I tried to set the serializer on the PhysicianSerializer class as read_only but then, django tries to store the model with a null user_id. How can I save a model without try to insert an related object too?</p>