1

Ich arbeite an einem kleinen Projekt, um Django REST Framework (und später ein React Frontend) zu üben, bevor ich die Fähigkeiten anwende, die ich in einem viel größeren Unternehmensprojekt gelernt habe.TypeError: "ModelBase ist nicht iterierbar"

Das Projekt ist eine Back-End-API, die es jemandem ermöglicht zu sehen, welche möglichen Verbrechen und Vergehen eine Hauptfigur in jeder Episode von It's Always Sunny in Philadelphia begangen hat. Zu diesem Zweck habe ich das GitHub-Repository this erstellt und ein Django-Projekt darin eingefügt.

finde ich mich im Browser Debug-Ansicht, die einen Fehler bekommen, die ich nicht ganz in der Lage bin, um herauszufinden, wenn ich ein neues Modell/Serializer/Blick für die Website hinzufügen:

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/characters/ 

Django Version: 1.10.6 
Python Version: 3.6.0 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'rest_framework', 
'offense_api.apps.OffenseApiConfig'] 
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.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/Users/person/.virtualenvs/IASIP/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner 
    42.    response = get_response(request) 

File "/Users/person/.virtualenvs/IASIP/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/Users/person/.virtualenvs/IASIP/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Users/person/.virtualenvs/IASIP/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view 
    58.   return view_func(*args, **kwargs) 

File "/Users/person/Workspace/IASIP_API/offense_api/views.py" in character_list 
    70.   return JsonResponse(serializer.data, safe=False) 

File "/Users/person/.virtualenvs/IASIP/lib/python3.6/site-packages/rest_framework/serializers.py" in data 
    729.   ret = super(ListSerializer, self).data 

File "/Users/person/.virtualenvs/IASIP/lib/python3.6/site-packages/rest_framework/serializers.py" in data 
    262.     self._data = self.to_representation(self.instance) 

File "/Users/person/.virtualenvs/IASIP/lib/python3.6/site-packages/rest_framework/serializers.py" in to_representation 
    647.    self.child.to_representation(item) for item in iterable 

Exception Type: TypeError at /characters/ 
Exception Value: 'ModelBase' object is not iterable 

Dies geschieht nur mit die Seite Zeichen, die mit meiner anderen Listenansicht übereinstimmen sollte, eine Liste der Jahreszeiten.

Serializers.py

from rest_framework import serializers 
from offense_api.models import Season, Episode, Character 


class SeasonSerializer(serializers.ModelSerializer): 
    episodes = serializers.StringRelatedField(many=True) 

    class Meta: 
     model = Season 
     fields = ('season_number', 'episodes') 


class EpisodeSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Episode 
     fields = ('episode_number', 'episode_title', 'episode_season') 


class CharacterSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Character 
     fields = ('character_legal_first_name', 'character_legal_last_name', 'character_preferred_name',) 

Models.py

from django.db import models 


class Season(models.Model): 
    season_created = models.DateTimeField(auto_now_add=True) 
    season_number = models.IntegerField(unique=True) 

    def __unicode__(self): 
     return self.season_number 

    def __str__(self): 
     return str(self.season_number) 


class Episode(models.Model): 
    episode_season = models.ForeignKey(Season, related_name='episodes', on_delete=models.CASCADE) 
    episode_created = models.DateTimeField(auto_now_add=True) 
    episode_number = models.IntegerField() 
    episode_title = models.CharField(max_length=300, default='') 

    def __unicode__(self): 
     return '%d. %d' % (self.episode_season.season_number, self.episode_number) 

    def __str__(self): 
     return '%d. %d' % (self.episode_season.season_number, self.episode_number) 

    class Meta: 
     unique_together = ('episode_season', 'episode_number') 
     ordering = ('episode_number',) 


class Character(models.Model): 
    character_created = models.DateTimeField(auto_now_add=True) 
    character_legal_first_name = models.CharField(max_length=50, default='', null=True) 
    character_legal_last_name = models.CharField(max_length=100, default='', null=True) 
    character_preferred_name = models.CharField(max_length=150, default='', primary_key=True) 

    def __unicode__(self): 
     return self.character_preferred_name 

    def __str__(self): 
     return self.character_preferred_name 

    class Meta: 
     ordering = ('character_preferred_name',) 

Views.py

from django.http import HttpResponse, JsonResponse 
from django.views.decorators.csrf import csrf_exempt 
from rest_framework.renderers import JSONRenderer 
from rest_framework.parsers import JSONParser 
from offense_api.models import Episode, Season, Character 
from offense_api.serializers import EpisodeSerializer, SeasonSerializer, CharacterSerializer 


@csrf_exempt 
def season_list(request): 
    """ 
    List all seasons, or create a new one. 
    :param request: 
    :return: 
    """ 
    if request.method == 'GET': 
     seasons = Season.objects.all() 
     serializer = SeasonSerializer(seasons, many=True) 
     return JsonResponse(serializer.data, safe=False) 

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


@csrf_exempt 
def season_detail(request, pk): 
    """ 
    Retrieve, update, or delete a season. 
    :param request: 
    :param pk: 
    :return: 
    """ 
    try: 
     season = Season.objects.get(pk=pk) 
    except Season.DoesNotExist: 
     return HttpResponse(status=404) 

    if request.method == 'GET': 
     serializer = SeasonSerializer(season) 
     return JsonResponse(serializer.data) 

    elif request.method == 'PUT': 
     data = JSONParser().parse(request) 
     serializer = SeasonSerializer(season, data=data) 
     if serializer.is_valid(): 
      serializer.save() 
      return JsonResponse(serializer.data) 
     return JsonResponse(serializer.errors, status=400) 

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


@csrf_exempt 
def character_list(request): 
    """ 
     List all characters, or create a new one. 
     :param request: 
     :return: 
     """ 
    if request.method == 'GET': 
     characters = Character.objects.all() 
     serializer = CharacterSerializer(Character, many=True) 
     return JsonResponse(serializer.data, safe=False) 

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

Urls.py

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

urlpatterns = [ 
    url(r'^seasons/$', views.season_list), 
    url(r'^seasons/(?P<pk>[0-9]+)/$', views.season_detail), 
    url(r'^characters/$', views.character_list), 
] 

Was benötigt, um geändert werden, um diesen Fehler zu bekommen?

+0

ich sehen Sie das 'Character' Modell in der' 0004_auto_20170327_1633.py' Migration gelöscht haben. Das könnte die Ursache Ihres Problems sein. Obwohl Sie Ihre '0006'-Migration nicht vorgenommen haben, kann ich die Ablaufverfolgung in der Tabelle' django_migrations' Ihrer Datenbank sehen. Da 'Character' wieder in den Modellen zu sein scheint, können Sie uns diese Migrationsdatei zeigen? –

+0

@ RaphaëlGomès Ich habe 0006_character.py nach Ihrer Anfrage aufgelegt. – nerdenator

Antwort

2

In views.py übergeben Sie die Klasse Character an den Serialiser. Sie sollten die Datenzeichen übergeben.

Auch bevorzugten Namen nicht als Primärschlüssel verwenden Sie es einfach nicht eindeutige

sein könnte
Verwandte Themen