2016-11-03 5 views
0

Я пытаюсь реализовать простой отдых api с django. Однако я получаю следующее сообщение об ошибке,django тип покоя поля ошибки не JSON serializable

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')) 
] 

Если вы запускали свои миграции после того как вы населенный models.py вы должны быть в состоянии увидеть ответ от API, даже если это просто пустой список.

+0

спасибо за этот ответ, но когда я запустил «makemigrations», я столкнулся со следующей ошибкой; from .. events import views ValueError: попытка относительного импорта за пределы пакета верхнего уровня – cano

+0

добавить путь для приложения 'events' к вашему PYTHONPATH. В противном случае исследуйте структуру каталогов и убедитесь, что она аналогична моей. Я не могу помочь вам больше, чем у меня уже есть с предоставленной информацией, поскольку я перечислял каждый шаг для рабочего приложения. – seanmus

Смежные вопросы