Реализовать метод обновления на вложенном сериализаторе в Django 1.11 и django _rest framework - PullRequest
0 голосов
/ 02 мая 2018

Я реализовал представление на основе классов в views.py, хотя, когда я пытался обновить сотрудника, я понял, что я как будто пытаюсь создать новое, но у меня определен метод PUT. У меня возникла проблема с обновлением данных пользователя, поскольку поле user является ключом Foreign . enter image description here

A user with that username already exists.
Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.

views.py

class EmployeeDetailView(APIView):
    permission_classes = [AllowAny]
    # queryset = Employee.objects.all()
    # serializer_class = EmployeeSerializer
    """
    Retrieve, update or delete a employee instance.
    """

    def get_object(self, pk):
        try:
            return Employee.objects.get(pk=pk)
        except Employee.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        employee = self.get_object(pk)
        serializer = EmployeeSerializer(employee)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        employee = self.get_object(pk)
        serializer = EmployeeSerializer(employee, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py

class EmployeeSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    contract_type = ContractSerializer(read_only=True)
    company = CompanySerializer(read_only=True)
    job_title = JobSerializer(read_only=True)
    department = DepartmentSerializer(read_only=True)
    skill = SkillSerializer(read_only=True)
    unit = UnitSerializer(read_only=True)

    class Meta:
        model = Employee
        fields = ['id', 'user', 'hr_number', 'contract_type', 'company',
                  'tax_id_number', 'joining_date', 'job_title', 'skill', 'unit',
                  'department', 'identification_number', 'is_manager', 'active']

1 Ответ

0 голосов
/ 02 мая 2018

Для записываемого вложенного сериализатора необходимо определить update или create методы:

class EmployeeSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    contract_type = ContractSerializer(read_only=True)
    company = CompanySerializer(read_only=True)
    job_title = JobSerializer(read_only=True)
    department = DepartmentSerializer(read_only=True)
    skill = SkillSerializer(read_only=True)
    unit = UnitSerializer(read_only=True)

    class Meta:
        model = Employee
        fields = ['id', 'user', 'hr_number', 'contract_type', 'company',
                  'tax_id_number', 'joining_date', 'job_title', 'skill', 'unit',
                  'department', 'identification_number', 'is_manager', 'active']

    def update(self, instance, validated_data):
        user_data = validated_data.pop('user')
        if user_data:
            instance.user.first_name = user_data.get('first_name')
            instance.user.last_name = user_data.get('last_name')
            # update other user's fields here
            instance.user.save()
        employee = super(EmployeeSerializer, self).update(instance, validated_data)
        return employee
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...