2016-11-03 87 views
0

我试图用django实现简单的休息api。但是我收到以下错误,django休息类型错误字段不是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我添加了路线。但我没有任何视图集,因为我认为,get方法和视图集一样。不是吗? – 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')) 
] 

如果你跑你的迁移人口,你以后models.py你应该能够看到来自API的响应,即使它是只是一个空的列表。

+0

感谢您的回答,但是当我运行“makemigrations”时遇到了以下错误;从..事件导入视图 ValueError:试图相对导入超出顶级包 – cano

+0

将'events'应用程序的路径添加到您的PYTHONPATH中。否则,请调查您的目录结构并确保它与我的类似。由于我列出了正在运行的应用程序的每一步,因此我无法帮助您获得所提供的信息。 – seanmus

相关问题