Реализовать метод обновления во вложенном сериализаторе в Django 1.11 и django _rest framework

Я реализовал представление на основе классов в views.py, хотя, когда я попытался обновить сотрудника, я понял, что это как будто я пытаюсь создать нового, но у меня определен метод PUT. У меня проблема с обновлением сведений о пользователе, поскольку поле user является ключом Иностранный. Реализовать метод обновления во вложенном сериализаторе в Django 1.11 и django _rest framework

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

Какую версию drf вы используете?

Umair Mohammad 02.05.2018 08:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
141
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для записываемый вложенный сериализатор вам необходимо определить методы 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

Другие вопросы по теме