Sourabh Chopade
Sourabh Chopade

Reputation: 543

How to get data from multiple models in djago rest framework

I am new in Django Rest APi so Please help.

I have Two models :

class Department(models.Model):
    name = models.CharField(max_length = 50)
    location = models.CharField(max_length=20)
    dept_code = models.CharField(max_length=5)

class Employee(models.Model):
    name = models.CharField(max_length = 50)
    email = models.EmailField()
    mobile = models.CharField(max_length=10)
    department = models.ForeignKey(Department, on_delete= models.CASCADE)'

And Respective serializers are:

class EmployeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee
        fields = '__all__'

class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = '__all__'

I want to retrieve the data in like this

{
    emptId : 1,
    empName : 'John',
    empEmail : '[email protected]',
    empMobile : '1111111111',
    deptId : 1,
    deptName : 'Accounts',
    deptLocation : 'Pune',
    deptCode : 'ACC'
}

How to get the above data. Please help me

Upvotes: 3

Views: 1529

Answers (2)

Pruthvi Barot
Pruthvi Barot

Reputation: 2018

In Your Serializers.py

class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = '__all__'

class EmployeeSerializer(serializers.ModelSerializer):
    department = DepartmentSerializer(many=False)

    class Meta:
        model = Employee
        fields = ('empId','empName','empEmail','empMobile','department')

using this you will get nested object structure which is preferred.

If you want to get flatten structure then

class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Department
        fields = '__all__'

class EmployeeSerializer(serializers.ModelSerializer):
    department = DepartmentSerializer(many=False)
    depId = serializers.IntergerField(source='department.id')
    depName = serializers.CharField(source='department.name')
    depLocation = serializers.CharField(source='department.location')
    depCode = serializers.CharField(source='department.dept_code')
    class Meta:
        model = Employee
        fields = ('empId','empName','empEmail','empMobile','depId','depName','depLocation','depCode','department')

Hope you get this If you don't want department object in get method then add write_only=True in argument of department field.

see more readonly and writeonly

medium

Upvotes: 2

Ali
Ali

Reputation: 2591

You can write your serializer class like this:

class MySerializer(serializers.Serializer):
    emptId = serializers.IntergerField()
    empName = serializers.CharField()
    empEmail = serializes.CharField()
    empMobile = serializes.CharField()
    depId = serializers.IntergerField()
    depName = serializers.CharField()
    depLocation = serializers.CharField()
    depCode = serializers.CharField()

    class Meta:
        fields = ('emptId', 'empName', 'empEmail', 'empMobile', 'depId', 'depName', 'depLocation', 'depCode',)

And you can write your view class like this:

class MyAPIView(APIView):
    def get(self, request, *args, **kwargs):
        employeeId = 1
        myEmployee = Employee.objects.filter(id=employeeId) \
                                     .annotate(emptId=F('id'),
                                               empName=F('name'),
                                               empEmail=F('email'),
                                               empMobile=F('mobile'),
                                               depId=F('department__id'),
                                               depName=F('department__name'),
                                               depLocation=F('department__location')
                                               depCode=F('department__dep_code').values('emptId', 'empName', 'empEmail', 'empMobile', 'depId', 'depName', 'depLocation', 'depCode').first()

        mySerializer = MySerializer(myEmployee)
        return Response(mySerializer, status=status.HTTP_200_OK)

I do not test the code in a real program. But you can write your code like my code. You can inspire of that.

Upvotes: 1

Related Questions