Django 键错误';id';尝试访问ViewSet创建定义中的request.data时

Django 键错误';id';尝试访问ViewSet创建定义中的request.data时,django,django-rest-framework,Django,Django Rest Framework,我最近从drf 2.4升级到v3,并一直试图覆盖我的一个视图集中的def Create。但是,当尝试访问已保存到序列化程序变量的request.data时,我将收到一个错误:keyrorm at/api/appoints/ “id” 我将包括我的视图集代码、序列化程序和以下错误的回溯: class AppointmentViewSet(viewsets.ModelViewSet): queryset = Appointment.objects.all() serializer_c

我最近从drf 2.4升级到v3,并一直试图覆盖我的一个视图集中的
def Create
。但是,当尝试访问已保存到序列化程序变量的request.data时,我将收到一个错误:
keyrorm at/api/appoints/
“id”

我将包括我的视图集代码、序列化程序和以下错误的回溯:

class AppointmentViewSet(viewsets.ModelViewSet):
    queryset = Appointment.objects.all()
    serializer_class = AppointmentSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                      IsOwnerOrReadOnly,)
    def create(self, request):
            serializer = AppointmentSerializer(data=request.data)
            if serializer.is_valid(raise_exception=True):
            #get the datetime object from the request data and filter availability objects, datetime stored in attribute .when
                    avQueryset = Availability.objects.filter(date__range=(serializer.data.when, serializer.data.when))
    def pre_save(self, obj):
            obj.service_recipient = self.request.user
序列化程序

class AppointmentSerializer(serializers.ModelSerializer):
        class Meta:
                model = Appointment
                fields = ('id','availability' , 'business_location', 'services', 'when', 'service_recipient', 'completed')
repr(序列化程序)

回溯

Environment:


Request Method: POST
Request URL: http://104.131.110.138/api/appointments/

Django Version: 1.7.1
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'webapp',
 'rest_framework')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/viewsets.py" in view
  85.             return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/views.py" in dispatch
  407.             response = self.handle_exception(exc)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/views.py" in dispatch
  404.             response = handler(request, *args, **kwargs)
File "/home/appointments/appointments/webapp/views.py" in create
  57.                   avQueryset = Availability.objects.filter(date__range=(serializer.data.when, serializer.data.when))
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py" in data
  422.         ret = super(Serializer, self).data
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py" in data
  179.                 self._data = self.to_representation(self.validated_data)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py" in to_representation
  387.             attribute = field.get_attribute(instance)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/fields.py" in get_attribute
  277.         return get_attribute(instance, self.source_attrs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/fields.py" in get_attribute
  65.                 instance = instance[attr]

Exception Type: KeyError at /api/appointments/
Exception Value: 'id'

您使用的是
serializer.data
,而您似乎打算使用
serializer.validated\u data
。当您希望序列化现有对象时,实际上应该只使用
serializer.data
,这需要在初始化序列化器时将
实例
传递到序列化器中

问题是您没有将
实例
传递到序列化程序中,因此它希望传递到序列化程序中的
初始
数据可以序列化。这将要求
数据
具有序列化程序上的所有字段,包括看起来不存在的
id


您可以使用
serializer.validated_data[“when”]
获取已验证的数据,而不是已序列化的数据。Django REST框架的文档中特别提到了这一点。

尝试
serializer.data['when']
而不是
serializer.data.when
刚刚尝试
serializer.data['when']
但仍然得到相同的keyrortry
serializer.validated\u data
而不是
serializer.data
Environment:


Request Method: POST
Request URL: http://104.131.110.138/api/appointments/

Django Version: 1.7.1
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'webapp',
 'rest_framework')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/viewsets.py" in view
  85.             return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/views.py" in dispatch
  407.             response = self.handle_exception(exc)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/views.py" in dispatch
  404.             response = handler(request, *args, **kwargs)
File "/home/appointments/appointments/webapp/views.py" in create
  57.                   avQueryset = Availability.objects.filter(date__range=(serializer.data.when, serializer.data.when))
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py" in data
  422.         ret = super(Serializer, self).data
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py" in data
  179.                 self._data = self.to_representation(self.validated_data)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py" in to_representation
  387.             attribute = field.get_attribute(instance)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/fields.py" in get_attribute
  277.         return get_attribute(instance, self.source_attrs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/fields.py" in get_attribute
  65.                 instance = instance[attr]

Exception Type: KeyError at /api/appointments/
Exception Value: 'id'