Django rest framework 如何在djago rest框架中从多个模型获取数据

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

我是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 = 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

看更多