简体   繁体   English

Django REST Framework 上的动态更新实例

[英]Dynamic update instance on Django REST Framework

Hi I'm trying to update dynamically using custom method update Django REST Framework like this:嗨,我正在尝试使用自定义方法 update Django REST Framework 动态更新,如下所示:

serializers.py序列化程序.py

class ArtistSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=False)
    name = serializers.CharField(max_length=100, required=True)

    def create(self, validated_data):
        Personnels.objects.create(**self.validated_data)

    def update(self, instance, validated_data):
        # for k,v in self.validated_data.iteritems():
            # instance['k'] = self.validated_data.get(k, instance[k])
        # instance.name = self.validated_data.get('name', instance.name)
        instance['name'] = self.validated_data.get('name', instance.name)
        instance.save()
        return instance

views.py视图.py

@api_view(['PUT'])
def artist_serialization_specific(request, artist_id):
    if request.method == "PUT": # Example of updating an object via manual serialization
        # return HttpResponse(artist_id)
        personnel = Personnels.objects.get(id=artist_id)
        x = ArtistSerializer(personnel, data={"name":"John Doe"})
        if x.is_valid():
            x.update(personnel, x.validated_data)
        else:
            print x.errors
        return Response(x.data, status=status.HTTP_200_OK)

However I get this error:但是我收到这个错误:

Internal Server Error: /forms/artists/serialization/3/
Traceback (most recent call last):
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/rest_framework/views.py", line 474, in dispatch
    response = self.handle_exception(exc)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/rest_framework/views.py", line 434, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/rest_framework/views.py", line 471, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/deanarmada/.virtualenvs/django-cassandra/lib/python2.7/site-packages/rest_framework/decorators.py", line 52, in handler
    return func(*args, **kwargs)
  File "/Users/deanarmada/Desktop/projects/python-projects/django/django-cassandra/tutorial/example/views.py", line 85, in artist_serialization_specific
    x.update(personnel, x.validated_data)
  File "/Users/deanarmada/Desktop/projects/python-projects/django/django-cassandra/tutorial/example/serializers.py", line 21, in update
    instance['name'] = self.validated_data.get('name', instance.name)
TypeError: 'Personnels' object does not support item assignment

This worked for me.这对我有用。 I hope it can as well work for you.我希望它也可以为你工作。

def update(self, instance, validated_data):
        # instance.username = validated_data.get('username', instance.username)
        # instance.email = validated_data.get('email', instance.email)
        # print(validated_data)
        # print(validated_data.keys())

        for (key, value) in validated_data.items():
            setattr(instance, key, value)
        instance.save()
        return instance

Use setattr(instance, "name", value) instead:使用setattr(instance, "name", value)代替:

setattr(instance, "name", self.validated_data.get('name', instance.name))

It's not possible to change django object attributes by "item assignments" indeed.确实不可能通过“项目分配”来更改 django 对象属性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM