13

Here is my models.py

from __future__ import unicode_literals
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=200)
    company_name = models.ForeignKey('Company',on_delete=models.CASCADE,related_name='user')

    def __str__(self):
        return self.name

class Company(models.Model):
    name = models.CharField(max_length=200)
    phone_number = models.IntegerField(null=True,blank=True)

    def __str__(self):
        return self.name

class Catalog(models.Model):
    name = models.CharField(max_length=200)
    no_of_pcs = models.IntegerField(null=True,blank=True)
    per_piece_price = models.DecimalField(null=True,blank=True,max_digits=10,decimal_places=2)
    company_name = models.ForeignKey(Company,on_delete=models.CASCADE,related_name='catalog')

    def __str__(self):
        return self.name

here is my serializers.py

from rest_framework import serializers
from .models import *
from django.db.models import Sum,Count

class UserSerializer(serializers.ModelSerializer):
    # name = serializers.StringRelatedField()
    # company_name = serializers.CharField()
    class Meta:
        model = User
        fields = '__all__'

here is my views.py

from __future__ import unicode_literals
from django.http import HttpResponse
from .models import *
import json
from django.http import JsonResponse, HttpResponse
from .serializers import *
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import viewsets

class UserView(viewsets.ModelViewSet):
    queryset =  User.objects.all()
    serializer_class = UserSerializer

I am getting api like this.. Here i am getting id instead of company_name.

[
    {
        "id": 1,
        "name": "soubhagya",
        "company_name": 1
    },
    {
        "id": 2,
        "name": "nihar",
        "company_name": 2
    }
]

But i am expecting output--

like this:

[
    {
        "id": 1,
        "name": "soubhagya",
        "company_name": "google"
    },
    {
        "id": 2,
        "name": "nihar",
        "company_name": "facebook"
    }
]

I am expecting my api like this. with company_name. And i wants to post the data from same api in rest framework thanks,,

Arindam Roychowdhury
  • 5,927
  • 5
  • 55
  • 63

6 Answers6

24

Since you'd defined the __str__() method in your Company model, you can use the StringRelatedField() as

class UserSerializer(serializers.ModelSerializer):
    company_name = serializers.StringRelatedField()
    class Meta:
        model = User
        fields = '__all__'


UPDATE
override the to_representation method

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

    def to_representation(self, instance):
        rep = super(UserSerializer, self).to_representation(instance)
        rep['company_name'] = instance.company_name.name
        return rep
JPG
  • 82,442
  • 19
  • 127
  • 206
10

simple solution is use source

class UserSerializer(serializers.ModelSerializer):
    company_name = serializers.CharField(source='company_name.name')
Brown Bear
  • 19,655
  • 10
  • 58
  • 76
  • 1
    This is the simplest and one could add a company id as a field so that it could be used for forms in a js page (to represent the "company"). – Harlin May 16 '21 at 22:17
4

Use depth.

class PhoneSerializer(serializers.ModelSerializer):
    class Meta:
        model = Phone
        depth = 1
        fields = '__all__'
Arindam Roychowdhury
  • 5,927
  • 5
  • 55
  • 63
3
class UserSerializer(serializers.ModelSerializer):
    company_name = serializers.SerializerMethodField(source='get_company_name')
    class Meta:
        model = User
        fields = '__all__'
    def get_company_name(self, obj):
        return obj.company_name.name
Exprator
  • 26,992
  • 6
  • 47
  • 59
1
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

    def to_representation(self, instance):
        rep = super(UserSerializer, self).to_representation(instance)
        rep['company_name'] = instance.company_name.name
        return rep
token
  • 903
  • 1
  • 9
  • 23
0

Here is the documentation:

This worked for me:

company_name = serializers.SlugRelatedField(read_only=True, slug_field='name')
Dragos Neata
  • 153
  • 7