2017-03-08 95 views
0

我正在通過一本介紹Django和django rest框架的書。本教程創建一個包含遊戲,類別,玩家和分數的休息API,並在它們之間建立適當的關係模型。 插入類遊戲,我得到以下錯誤,當我在一個偶然的問題:django rest框架屬性錯誤

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的,更何況是這樣的Django掙扎着從給出的調試信息源在這裏的錯誤。

任何人都可以幫助我理解問題出在哪裏,爲什麼?

感謝

回答

1

如何去除GameCategorySerializerHyperlinkedModelSerializer

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會嘗試處理該字段(它不具有related_name屬性),而不是第一個(ForeignKey)。

+0

謝謝,但不幸的是沒有任何區別。完全相同的錯誤。 – LDJ

+0

我想我找到了它......更新了我的答案! –

+0

你說得對。這確實是重複的。你是如何從錯誤中推斷出來的?我現在有另一個錯誤(沒有這樣的列:games_game.game_category_id),但寧願知道如何自己調試這些。有任何想法嗎?謝謝 – LDJ

相關問題