Thinker
Thinker

Reputation: 5366

Django custon user model/serializer

I have a Farmer model which basically is the extension of User I want to use first_name & last_name from user in my Farmer and would like to serialize them as well.

My models.py looks like following:

class Farmer(models.Model):

  #Field for refering the default user
  user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)

  def __str__(self):              # __unicode__ on Python 2
    return "%s the farmer" % self.user.username

My serializers.py looks like following:

class UserSerializer(serializers.ModelSerializer):
first_name = serializers.CharField(required=True)
last_name = serializers.CharField(required=True)
class Meta:
    model = User
    fields = ('first_name', 'last_name')


class FarmerSerializer(serializers.ModelSerializer):
 user = UserSerializer()
 ...
 ...  
 class Meta:
    model = Farmer
    fields = ('user','birth_date', 'email', 'phone_number')

For which I get JSON as follows:

{"user": {"first_name": "Jannes","last_name": "Stubbi"}, "birth_date": "2016-04-13", "email": "[email protected]", "phone_number": "+4912345678" },]

I rather wish to get data as:

{"first_name": "Jannes","last_name": "Stubbi", "birth_date": "2016-04-13", "email": "[email protected]", "phone_number": "+4912345678" }

My views.py

  class JSONResponse(HttpResponse):
  """
  An HttpResponse that renders its content into JSON.
  """
  def __init__(self, data, **kwargs):
    content = JSONRenderer().render(data)
    kwargs['content_type'] = 'application/json'
    super(JSONResponse, self).__init__(content, **kwargs)


#view to get the details of all the farmers
@api_view(('GET',))
def get_all_farmers_details(request):

 #Fetch all the farmers from database
 results = Farmer.objects.all()
 #Serialize the obtained results
 serializer = FarmerSerializer(results, many=True)
 return Response(serializer.data)

How can I achieve this?

Upvotes: 0

Views: 397

Answers (2)

Kaviraj Kanagaraj
Kaviraj Kanagaraj

Reputation: 431

May be you can try something like this.

class FarmerSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(source='user.first_name')
    last_name = serializers.CharField(source='user.last_name')
    ..
    ..
    class Meta:
        model = Farmer
        fields = ('first_name', 'last_name', 'phone_number', 'email')

the trick is to use the 'source' attribute.

Upvotes: 1

Rohit Arya
Rohit Arya

Reputation: 6791

You can modify serializer.data returned by the view:

@api_view(('GET',))
def get_all_farmers_details(request):

    #Fetch all the farmers from database
    results = Farmer.objects.all()
    #Serialize the obtained results
    serializer = FarmerSerializer(results, many=True)

    userDict = serializer.data.pop("user", None)
    if userDict is not None:
        serializer.data['first_name'] = userDict['first_name']
        serializer.data['last_name'] = userDict['last_name']

    return Response(serializer.data)

Upvotes: 0

Related Questions