2016-10-08 13 views
0

私のdjango REST APIにシリアライザがほとんど作成されず、奇妙な問題が発生しました。フィールドはシリアライザで宣言されていますが、django restにエラーがありません

Environment:

Request Method: GET Request URL: http://localhost:8000/api/users/

Django Version: 1.10.2 Python Version: 3.5.2 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'api'] Installed Middleware: ['django.middleware.security.SecurityMiddleware', '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 "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\django\core\handlers\exception.py" in inner 39. response = get_response(request)

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\django\core\handlers\base.py" in _legacy_get_response 249. response = self._get_response(request)

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\django\core\handlers\base.py" in _get_response 217. response = self.process_exception_by_middleware(e, request)

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\django\core\handlers\base.py" in _get_response 215. response = response.render()

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\django\template\response.py" in render 109. self.content = self.rendered_content

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\response.py" in rendered_content 72. ret = renderer.render(self.data, accepted_media_type, context)

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\renderers.py" in render 697. context = self.get_context(data, accepted_media_type, renderer_context)

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\renderers.py" in get_context 630. raw_data_post_form = self.get_raw_data_form(data, view, 'POST', request)

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\renderers.py" in get_raw_data_form 553. content = renderer.render(serializer.data, accepted, context)

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\serializers.py" in data 508. ret = super(Serializer, self).data

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\serializers.py" in data 244. self._data = self.get_initial()

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\serializers.py" in get_initial 387. for field in self.fields.values()

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\serializers.py" in fields 340. for key, value in self.get_fields().items():

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\serializers.py" in get_fields 947. field_names = self.get_field_names(declared_fields, info)

File "D:\code\active\Python\Django\photo-hub\photo-hub\env\lib\site-packages\rest_framework\serializers.py" in get_field_names 1046. serializer_class=self.class.name

Exception Type: AssertionError at /api/users/ Exception Value: The field 'photos' was declared on serializer UserSerializer, but has not been included in the 'fields' option.

をしかし、私のUserSerializerも、「写真」フィールドを持っていない:私はよhttp://127.0.0.1:8000/api/register/ URLに行くときにエラーが発生します。私は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

完全なトレースバックを提供できますか? – Linovia

+0

完全なトレースバックを追加します。 – Rodion

+0

私はRESTフレームワークに精通していませんが、これはあなたのアルバムリソースからの写真フィールドがあなたのユーザーに伝えられていることと疑いがあります。 –

答えて

0

最後に私は私の愚かなエラーの原因を発見しました。その理由は、以前の私のモデルでは写真のフィールドがあったということでした。しかし、モデルを変更した後は、移行を忘れてしまいます。

関連する問題