该字段是在序列化程序中声明的,但在django rest

时间:2016-10-08 05:06:13

标签: python django django-rest-framework

我在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()),

1 个答案:

答案 0 :(得分:2)

最后我找到了我的愚蠢错误的来源。原因是早些时候我的模型中有照片场。但是在对模型进行更改之后,我忘了进行迁移。