Reputation: 543
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
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
Upvotes: 2
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