Django rest framework 如何在djago rest框架中从多个模型获取数据
我是Django Rest APi的新手,请帮助我 我有两种型号:Django rest framework 如何在djago rest框架中从多个模型获取数据,django-rest-framework,Django Rest Framework,我是Django Rest APi的新手,请帮助我 我有两种型号: 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 = mod
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)'
和相应的序列化程序是:
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = '__all__'
class DepartmentSerializer(serializers.ModelSerializer):
class Meta:
model = Department
fields = '__all__'
我想像这样检索数据
{
emptId : 1,
empName : 'John',
empEmail : 'John@gmail.com',
empMobile : '1111111111',
deptId : 1,
deptName : 'Accounts',
deptLocation : 'Pune',
deptCode : 'ACC'
}
如何获取上述数据。请帮助我您可以这样编写序列化程序类:
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',)
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)
您可以这样编写视图类:
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',)
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)
我不会在真实的程序中测试代码。但是你可以像我的代码一样编写代码。你可以从中得到启发。在你的
序列化程序中.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')
使用此选项,您将获得首选的嵌套对象结构
如果你想得到平坦的结构,那么
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')
希望你收到这个
如果您不想在get方法中使用department
对象,则在department字段的参数中添加write_only=True
看更多