2017-03-08 4 views
0

나는 장고와 장고 휴식 틀을 소개하는 책을 만들고있다. 이 튜토리얼은 게임, 카테고리, 플레이어 및 스코어 간의 적절한 관계형 모델을 사용하여 나머지 API를 작성합니다.django rest framework attributeerror

class GameCategory(models.Model): 
    name = models.CharField(max_length=200) 

    class Meta: 
     ordering = ('name',) 

    def __str__(self): 
     return self.name 

class Game(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    name = models.CharField(max_length=200, blank=True, default='') 
    game_category = models.ForeignKey(GameCategory, related_name='games', on_delete=models.CASCADE) 
    release_date = models.DateTimeField() 
    game_category = models.CharField(max_length=200, blank=True, default='') 
    played = models.BooleanField(default=False) 

    class Meta: 
     ordering = ('name',) 
    def __str__(self): 
     return self.name 

내 urls.py의 조각을 : 나는 다음과 같은 오류가 게임 카테고리를 삽입 할 때 나는 문제에 발견 한 다음과 같이

AttributeError at /game-categories/ 
'GameCategory' object has no attribute 'games' 
Request Method: POST 
Request URL: http://127.0.0.1:8000/game-categories/ 
Django Version: 1.10.5 
Exception Type: AttributeError 
Exception Value:  
'GameCategory' object has no attribute 'games' 
Exception Location: C:\Users\user\AppData\Local\Programs\Python\Python36-32\lib\site-packages\rest_framework\fields.py in get_attribute, line 103 
Python Executable: C:\Users\user\AppData\Local\Programs\Python\Python36-32\python.exe 
Python Version: 3.6.0 
Python Path:  
['C:\\Python\\Django01\\gamesapi', 
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\python36.zip', 
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs', 
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\lib', 
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32', 
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages'] 
Server time: Wed, 8 Mar 2017 09:40:42 +0000 

내 게임과 GameCategory 모델

있습니다 :

urlpatterns = [ 
    url(r'^game-categories/$', views.GameCategoryList.as_view(),name=views.GameCategoryList.name), 
    url(r'^game-categories/(?P<pk>[0-9]+)$', views.GameCategoryDetail.as_view(), name=views.GameCategoryDetail.name), 

views.py :

from games.models import GameCategory 
from games.models import Game 
from games.models import Player 
from games.models import PlayerScore  
from games.serializers import GameCategorySerializer 
from games.serializers import GameSerializer 
from games.serializers import PlayerSerializer 
from games.serializers import PlayerScoreSerializer 
from rest_framework import generics 
from rest_framework.response import Response 
from rest_framework.reverse import reverse 

class GameCategoryList(generics.ListCreateAPIView): 
    queryset=GameCategory.objects.all() 
    serializer_class=GameCategorySerializer 
    name='gamecategory-list' 

class GameCategoryDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset=GameCategory.objects.all() 
    serializer_class = GameCategorySerializer 
    name = 'gamecategory-detail' 

class GameList(generics.ListCreateAPIView): 
    queryset=Game.objects.all() 
    serializer_class = GameSerializer 
    name = 'game-detail' 

class GameDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset=Game.objects.all() 
    serializer_class=GameSerializer 
    name='game-detail' 

serializers.py

난 여전히 파이썬에 아주 새로운 해요
from rest_framework import serializers 
from games.models import GameCategory 
from games.models import Game 
from games.models import Player 
from games.models import PlayerScore 
import games.views 

class GameCategorySerializer(serializers.HyperlinkedModelSerializer): 
    games = serializers.HyperlinkedRelatedField(
     many=True, 
     read_only=True, 
     view_name='game-detail' 
    ) 

    class Meta: 
     model = GameCategory 
     fields = ('url','pk','name','games') 

class GameSerializer(serializers.HyperlinkedModelSerializer): 
    #We want to display the game categorys name instead of the id 
    game_category = serializers.SlugRelatedField(queryset=GameCategory.objects.all(), slug_field='name') 

    class Meta: 
     model = Game 
     fields = (
      'url', 
      'game_category', 
      'name', 
      'release_date', 
      'played' 
     ) 

혼자 장고 그렇게 주어진 디버그 정보에서 여기 오류를 소스로 어려움을 겪고 보자.

문제가있는 이유와 그 이유를 이해하는 데 도움을 줄 수있는 사람이 있습니까?

감사

답변

1

어떻게 GameCategorySerializer에서 HyperlinkedModelSerializer을 제거하는 방법에 대한?

class GameCategorySerializer(serializers.ModelSerializer): 
    # rest here unchanged 

자세한 내용은 here을 확인하십시오.

[업데이트] : Game 모델 안에 복제본이 있습니다!

game_category = models.ForeignKey(GameCategory, related_name='games', on_delete=models.CASCADE)

game_category = models.CharField(max_length=200, blank=True, default='')

을 당신은 뭔가 다른 두 번째 game_category 필드 이름을 변경해야합니다. 따라서 오류가 발생합니다. GameCategorySerializer은 첫 번째 필드 (ForeignKey) 대신이 필드 (related_name 속성이 없음)를 처리하려고합니다.

+0

감사합니다.하지만 불행히도 아무런 차이가 없습니다. 똑같은 오류. – LDJ

+0

내가 찾은 것 같아 ... 내 대답이 업데이트되었습니다! –

+0

네 말이 맞아. 그것은 실제로 중복되었습니다. 어떻게 그 오류에서 추론 했습니까? 다른 오류가 발생했습니다 (해당 열 : games_game.game_category_id). 그러나 직접 디버깅하는 방법을 선호합니다. 어떤 아이디어? 감사합니다 – LDJ