Обновление Django Rest Framework () с помощью kwargs из validated_data - PullRequest
0 голосов
/ 14 декабря 2018

Могу ли я обновить экземпляр в одну строку, не указывая все поля экземпляра?

Например:

def update(self, instance, validated_data):
    instance.name = validated_data.get('name', instance.name)
    instance.address = validated_data.get('address', instance.address)
    instance.save()
    return instance

Так что представьте, есть ли еще много полей рядом с именем и адресом.Могу ли я сделать что-нибудь, извлекая kwargs из validated_data?Как в методе create ():

def create(self, validated_data):
    return Person.objects.create(**validated_data)

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Это не однострочник, но достаточно короткий ( извлечено из источников drf ):

def update(self, instance, validated_data):
    for attr, value in validated_data.items():
        setattr(instance, attr, value)
    instance.save()
    return instance
0 голосов
/ 14 декабря 2018

Попробуйте использовать следующую функцию PUT.PUT будет более подходящим в соответствии со стандартами HTTP-метода REST.

def put(self, request, validated_data, *args, **kwargs):

    try:
        instance = self.queryset.get(pk=kwargs['pk'])
        serializer = InstanceSerializer()
        updated_instance = serializer.update(instance, request.data)
        return Response(InstanceSerializer(updated_instance).data)
    except Instance.DoesNotExist:
        return Response(
            data={
                'message': 'instance does not exist'
            },
            status=status.HTTP_404_NOT_FOUND
        )

Сначала получите экземпляр в соответствии с его pk.Добавьте сериализатор для последующей сериализации данных.Затем получите данные, которые вы хотите обновить, с помощью сериализатора и, наконец, добавьте их в ответ (если вам нужны обновленные данные).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...