Правильно обновляйте вложенные сериализаторы в Django Rest Framework - PullRequest
0 голосов
/ 16 мая 2018

Я использую django rest framework Я пытаюсь реализовать метод обновления для вложенного сериализатора. Как правильно реализовать метод обновления для вложенного сериализатора?

Я пытаюсь обновить существующего сотрудника, но получаю следующий ответ:

{
    "user": {
        "username": [
            "A user with that username already exists."
        ]
    }
}

Я реализовал метод обновления в сериализаторах только для обновления пользовательских полей.

class EmployeeUpdateSerializer(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', 'nssf_no', 'nhif_no', 'induction_date',
                  'induction_date', '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 = validated_data.get('user')
        instance.user.first_name = user.get('first_name')
        instance.user.save()

        return instance

Тогда в представлениях я реализовал следующее:

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

    def get(self, request, pk, format=None):
        try:
            employee = Employee.objects.get(pk=pk)
        except Employee.DoesNotExist:
            raise Http404
        serializer = EmployeeUpdateSerializer(employee)
        return Response(serializer.data, status=status.HTTP_200_OK)

    def put(self, request, pk, format=None):
        try:
            employee = Employee.objects.get(pk=pk)
            serializer = EmployeeUpdateSerializer(
                employee, data=request.data)
        except Employee.DoesNotExist:
            raise Http404
        # serializer = EmployeeUpdateSerializer(data=request.data)
        if serializer.is_valid():
            print(serializer.data)
            serializer.update()
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        return Response(serializer.data, status=status.HTTP_200_OK)

1 Ответ

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

UniqueValidator в поле вашего имени пользователя в UserSerializer вызывает эту проблему, он выполняет проверку по набору запросов, чтобы проверить, существует ли имя пользователя.

Вы можете удалить эту проверку в вашем UserSerializer, добавив следующее вмета-класс:

        extra_kwargs = {
        'username': {
            'validators': [],
        },
    }

Это быстрое и грязное исправление, поскольку оно приведет к проблемам с целостностью вашей БД, если вы попытаетесь сохранить 2 экземпляра с тем же именем пользователя.

...