Как получить данные из нескольких моделей в dja go rest framework - PullRequest
1 голос
/ 26 мая 2020

Я новичок в 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'
}

Как получить указанные выше данные. Пожалуйста, помогите мне

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

В вашем 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')

, используя это, вы получите структуру вложенных объектов, которая является предпочтительной.

Если вы хотите получить плоскую структуру, тогда

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')

Надеюсь, вы получите это Если вам не нужен объект department в методе get, добавьте write_only=True в аргумент поля отдела.

подробнее только для чтения и только для записи

средний

2 голосов
/ 26 мая 2020

Вы можете написать свой класс сериализатора следующим образом:

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)

Я не тестирую код в реальной программе . Но вы можете написать свой код, как мой. Вы можете этим вдохновиться.

...