Обновление для сериализаторов со многими = True поддерживается только создание в django API

Я использую многие из них в своем сериализаторе для создания новых полей. Мне нужно реализовать обновление, чтобы добавить новые поля и оставить существующие как есть. Mycode приведен ниже.

модели.py

class Device(models.Model):
   device_id = models.CharField(max_length=200)
   auth_token = models.CharField(max_length=100)


class ThirdPartyApps(models.Model):
   auth_token = models.ForeignKey(Device, on_delete=models.CASCADE)
   app_name = models.CharField(max_length=100)

сериализаторы.py

class AppSerializer(serializers.ModelSerializer):

    class Meta:
        model = Apps
        fields = ('app_name', 'auth_token_id')

    def create(self, validated_data):
        if "auth_token_id" in self.context:
            id1 = self.context["auth_token_id"]
            instance = self.Meta.model(**validated_data)
            user_id = id1
            if user_id is not None:
                instance.auth_token_id = user_id
                instance.save()
            return instance

просмотры.py

@api_view(['POST'])
def add_apps(request):
    data = request.data
    auth_token = request.META.get('HTTP_AUTHTOKEN', '')
    auth_tok = Device.objects.get(auth_token=auth_token)
    a_id = auth_tok.id
    serializer = AppSerializer(ThirdPartyApps, data=data, context={"auth_token_id": a_id}, many=True)
    if serializer.is_valid():
        serializer.save()
        content = collections.OrderedDict(
                [('status', True), ('message', "Third party apps are saved")])
        return Response(content, status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors)

Я попытался использовать поддержку обновлений django, указав имя модели и передав его сериализатору для вызова метода обновления. Но он говорит, что когда many=True, обновление не поддерживается, поддерживается только метод создания. Предлагается использовать класс ListSerializer и переопределить `.update() в моих сериализаторах. Я не могу понять, как его использовать. Я просто хочу обновить свои поля.


person Rishabh Pandey    schedule 04.10.2017    source источник


Ответы (1)


Аргументом для создания экземпляра сериализатора должен быть экземпляр, а не Model.

serializer = AppSerializer(ThirdPartyApps, data=data, context={"auth_token_id": a_id}, many=True)

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

Вам также необходимо следовать документации о том, как обрабатывать несколько обновлений.

person Linovia    schedule 05.10.2017
comment
Я пробовал точно так же, но когда many=True, он поддерживает только создание, но не обновление. Я уже прошел ссылку на документацию, но не могу понять, как добавить явное поле идентификатора в сериализатор экземпляра. - person Rishabh Pandey; 05.10.2017
comment
Это дает эту ошибку - Сериализаторы со многими = True по умолчанию не поддерживают множественное обновление, только множественное создание. Для обновлений непонятно, как быть с вставками и удалениями. Если вам нужно поддерживать несколько обновлений, используйте класс ListSerializer и переопределите .update(), чтобы вы могли точно указать поведение. - person Rishabh Pandey; 05.10.2017
comment
Вы не упомянули об id в первоначальном вопросе. Вы не предоставили функцию обновления, как описано в документации. Пожалуйста, закройте этот вопрос и начните новый. - person Linovia; 06.10.2017