2016-11-03 17 views
0

私はdjangoで簡単な残りのAPIを実装しようとしています。しかし、私は次のエラーを取得しています、django rest型エラーフィールドはJSONシリアライズ可能ではありません

enter image description here

//model.py

from django.db import models 

# Create your models here. 


class Event(models.Model): 

    name = models.TextField() 
    type = models.TextField() 
    location = models.TextField() 
    start_hour = models.TextField() 
    end_hour = models.TextField() 
    creator = models.TextField() 

    class Meta: 
     verbose_name = "Event" 
     verbose_name_plural = "Events" 

    def __str__(self): 
     return self.name 

//serializer.py

from rest_framework import serializers 
from .models import Event 

class EventSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Event 
     fields = ('name', 'type') 

//urls.py

from django.conf.urls import url 
from django.contrib import admin 
from rest_framework.urlpatterns import format_suffix_patterns 
from events import views 


urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^events/', views.EventList.as_view()), 
] 

urlpatterns = format_suffix_patterns(urlpatterns) 

I djangoで新しくて、私はこのエラーに対処する方法を理解することはできません。私を助けてください。

+0

ルートとビューセットを追加してください。 – seanmus

+0

@SeanMルートを追加しました。しかし、私は考えているので、私はビューセットを持っていない、メソッドを取得するビューセットと同じ考える。ではない? – cano

+0

makemigrationsを実行して移行しましたか? – seanmus

答えて

0

このセットアップで問題はありませんが、チュートリアルからリッピングされています。

プロジェクトフォルダdjango_example

アプリケーションフォルダevents

django_example/settings.py

追加:

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'rest_framework', 
    'events.apps.EventsConfig' 
] 

追加:

:コンテキストについては

events/apps.py

from __future__ import unicode_literals 
from django.apps import AppConfig 

class EventsConfig(AppConfig): 
    name = 'events' 

events/models.pyは次のようになります

from __future__ import unicode_literals  
from django.db import models 

# Create your models here. 

class Event(models.Model): 

    name = models.TextField() 
    kind = models.TextField() 
    location = models.TextField() 
    start_hour = models.TextField() 
    end_hour = models.TextField() 
    creator = models.TextField() 

    class Meta: 
     verbose_name = "Event" 
     verbose_name_plural = "Events" 

    def __str__(self): 
     return self.name 

typeをフィールド名として使用しないでください。

追加:

events/serializers.py

from rest_framework import serializers 
from .models import Event 
class EventSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Event 
     fields = ('name', 'kind') 

events/views.py

追加:

from django.shortcuts import render 

# Create your views here. 

from django.http import HttpResponse 
from django.views.decorators.csrf import csrf_exempt 
from rest_framework.renderers import JSONRenderer 
from rest_framework.parsers import JSONParser 
from events.models import Event 
from events.serializers import EventSerializer 

class JSONResponse(HttpResponse): 
    """ 
    An HttpResponse that renders its content into JSON. 
    """ 
    def __init__(self, data, **kwargs): 
     content = JSONRenderer().render(data) 
     kwargs['content_type'] = 'application/json' 
     super(JSONResponse, self).__init__(content, **kwargs) 

@csrf_exempt 
def event_list(request): 
    """ 
    List all code snippets, or create a new snippet. 
    """ 
    if request.method == 'GET': 
     snippets = Event.objects.all() 
     serializer = EventSerializer(snippets, many=True) 
     return JSONResponse(serializer.data) 

    elif request.method == 'POST': 
     data = JSONParser().parse(request) 
     serializer = EventSerializer(data=data) 
     if serializer.is_valid(): 
      serializer.save() 
      return JSONResponse(serializer.data, status=201) 
     return JSONResponse(serializer.errors, status=400) 

@csrf_exempt 
def event_detail(request, pk): 
    """ 
    Retrieve, update or delete a code snippet. 
    """ 
    try: 
     event = Event.objects.get(pk=pk) 
    except event.DoesNotExist: 
     return HttpResponse(status=404) 

    if request.method == 'GET': 
     serializer = EventSerializer(snippet) 
     return JSONResponse(serializer.data) 

    elif request.method == 'PUT': 
     data = JSONParser().parse(request) 
     serializer = EventSerializer(event, data=data) 
     if serializer.is_valid(): 
      serializer.save() 
      return JSONResponse(serializer.data) 
     return JSONResponse(serializer.errors, status=400) 

    elif request.method == 'DELETE': 
     event.delete() 
     return HttpResponse(status=204) 

events/urls.py

追加:

from django.conf.urls import url 
from events import views 

urlpatterns = [ 
    url(r'^events/$', views.event_list), 
    url(r'^events/(?P<pk>[0-9]+)/$', views.event_detail), 
] 

追加:

django_example/urls.py

from django.conf.urls import url, include 
from django.contrib import admin 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^', include('events.urls')) 
] 

をあなたはそれだとしても、あなたのAPIからの応答を見ることができるはずmodels.pyを埋めた後、あなたの移行を実行した場合ただ空のリスト。

+0

この回答に感謝しますが、私が "makemigrations"を実行したとき、私はエラーに続いて直面しました。 from .. events import views ValueError:トップレベルパッケージを超えて相対インポートを試みました – cano

+0

PYTHONPATHに 'events'アプリケーションのパスを追加しました。それ以外の場合は、ディレクトリ構造を調べて、それが私のものと似ていることを確認してください。私は、私が既に働いているアプリケーションのためのすべてのステップを記載したために、私が既に与えられた情報を持っている以上にあなたを助けることはできません。 – seanmus

関連する問題