2017-03-08 16 views
0

私はDjangoとdjango restフレームワークを紹介する本を読んでいます。このチュートリアルでは、適切なリレーショナルモデルを使用してゲーム、カテゴリ、プレーヤー、スコアを含む残りのAPIを作成します。 私はゲームカテゴリを挿入するとき、私は次のエラーを取得する問題につまずいてきました:次のようにdjango rest framework attributeerror

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モデルは以下のとおりです。

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のスニペット:

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

は、私はまだPythonのに非常に新しいです、おろかので、与えられたデバッグ情報から、ここでエラーを調達するために苦労ジャンゴ。

問題の原因とその原因を理解するのに役立つ人はいますか? GameCategorySerializerからHyperlinkedModelSerializerの削除について

おかげ

答えて

1

どのように?

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

関連する問題