我在django REST API中创建了一些序列化程序,并遇到了奇怪的问题。当我转到http://127.0.0.1:8000/api/register/
网址时,我得到错误:
环境:
请求方法:GET请求网址:http://localhost:8000/api/users/
Django版本:1.10.2 Python版本:3.5.2已安装的应用程序: [' django.contrib.admin',' django.contrib.auth', ' django.contrib.contenttypes',' django.contrib.sessions', ' django.contrib.messages',' django.contrib.staticfiles', ' rest_framework',' api']已安装的中间件: [' django.middleware.security.SecurityMiddleware&#39 ;, ' django.contrib.sessions.middleware.SessionMiddleware&#39 ;, ' django.middleware.common.CommonMiddleware&#39 ;, ' django.middleware.csrf.CsrfViewMiddleware&#39 ;, ' django.contrib.auth.middleware.AuthenticationMiddleware&#39 ;, ' django.contrib.auth.middleware.SessionAuthenticationMiddleware&#39 ;, ' django.contrib.messages.middleware.MessageMiddleware&#39 ;, ' django.middleware.clickjacking.XFrameOptionsMiddleware']
回溯:
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ django的\芯\处理程序\ exception.py" 在内心 39. response = get_response(request)
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ django的\芯\处理程序\ base.py" 在_legacy_get_response中 249. response = self._get_response(request)
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ django的\芯\处理程序\ base.py" 在_get_response中 217. response = self.process_exception_by_middleware(e,request)
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ django的\芯\处理程序\ base.py" 在_get_response中 215. response = response.render()
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ django的\模板\ response.py" 在渲染中 109. self.content = self.rendered_content
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ response.py" 在rendered_content中 72. ret = renderer.render(self.data,accepted_media_type,context)
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ renderers.py" 在渲染中 697. context = self.get_context(data,accepted_media_type,renderer_context)
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ renderers.py" 在get_context中 630. raw_data_post_form = self.get_raw_data_form(数据,视图,' POST',请求)
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ renderers.py" 在get_raw_data_form中 553. content = renderer.render(serializer.data,accepted,context)
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ serializers.py" 在数据中 508. ret = super(Serializer,self).data
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ serializers.py" 在数据中 244. self._data = self.get_initial()
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ serializers.py" 在get_initial中 387.对于self.fields.values()中的字段
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ serializers.py" 在田野里 340. for key,self.get_fields()。items()中的值:
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ serializers.py" 在get_fields中 947. field_names = self.get_field_names(declared_fields,info)
文件 " d:\代码\活性\的Python \ Django的\光毂\光毂\ ENV \ lib中\站点包\ rest_framework \ serializers.py" 在get_field_names中 1046. serializer_class = self。 class 。 name
异常类型:/ api / users / Exception的AssertionError值: 字段'照片'在序列化器UserSerializer上声明,但没有 已包含在'字段'选项。
但我的UserSerializer甚至没有照片'领域。我是django的新人,请帮助我理解这个问题的根源。
serializers.py
from django.utils import timezone
from django.contrib.auth.models import User
from rest_framework import serializers
from api.models import Album, Photo
class PhotoSerializer(serializers.HyperlinkedModelSerializer):
#url = serializers.HyperlinkedIdentityField(view_name="photo-detail")
album = serializers.HyperlinkedRelatedField(view_name='album-detail', queryset=Album.objects)
owner = serializers.HyperlinkedRelatedField(view_name='user-detail', queryset=User.objects)
class Meta:
model = Photo
fields = ('url', 'name', 'image', 'creation_date', 'owner', 'album')
read_only_fields=('creation_date')
class AlbumSerializer(serializers.HyperlinkedModelSerializer):
#url = serializers.HyperlinkedIdentityField(view_name="album-detail")
owner = serializers.HyperlinkedRelatedField(view_name='user-detail', queryset=User.objects)
photos = serializers.HyperlinkedRelatedField(view_name='photo-list', queryset=Photo.objects, many=True)
def get_validation_exclusions(self):
# Need to exclude `author` since we'll add that later based off the request
exclusions = super(AlbumSerializer, self).get_validation_exclusions()
return exclusions + ['user']
class Meta:
model = Album
fields = ('pk', 'name', 'creation_date', 'owner', 'photos')
read_only_fields=('creation_date')
class UserSerializer(serializers.HyperlinkedModelSerializer):
#url = serializers.HyperlinkedIdentityField(view_name="user-detail", read_only=True)
albums = serializers.HyperlinkedRelatedField(many=True, view_name='album-list', queryset=Album.objects)
password = serializers.CharField(write_only=True, required=True)
confirm_password = serializers.CharField(write_only=True, required=True)
class Meta:
model = User
fields = ('url', 'pk', 'username', 'email', 'password', 'is_staff', 'albums')
write_only_fields = ('password')
read_only_fiels = ('pk')
def create(self, validated_data):
user = User.objects.create(
username=validated_data['username'],
email=validated_data['email'],
)
user.set_password(validated_data['password'])
user.save()
return user
def update(self, instance, validated_data):
user = super(UserSerializer, self).update(instance, validated_data)
user.set_password(validated_data['password'])
user.save()
return user
def validate(self, data):
if data['password']:
if data['password'] != data['confirm_password']:
raise serializers.ValidationError(
"The passwords have to be the same"
)
return data
AuthRegister视图
class AuthRegister(APIView):
serializer_class = UserSerializer
permission_classes = (permissions.AllowAny,)
def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
API / urls.py
from django.conf.urls import include, url
from .views import AuthRegister
from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token, verify_jwt_token
from rest_framework import routers
from api import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'albums', views.AlbumViewSet)
router.register(r'photos', views.PhotoViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^login/', obtain_jwt_token),
url(r'^token-refresh/', refresh_jwt_token),
url(r'^token-verify/', verify_jwt_token),
url(r'^register/$', AuthRegister.as_view()),
答案 0 :(得分:2)
最后我找到了我的愚蠢错误的来源。原因是早些时候我的模型中有照片场。但是在对模型进行更改之后,我忘了进行迁移。