2016-04-10 76 views
1

我正在學習Django並嘗試使用Django REST框架創建遊戲REST API。我不確定如何更新發布者字段。是否需要爲我的Publisher類創建另一個Serializer並實施保存方法?無法在PrimaryKeyRelatedField上發送PUT請求

我使用的郵遞員發送PUT請求,我recieving這樣的:

"publisher": [ 
    "Incorrect type. Expected pk value, received unicode." 
    ] 

當我發送一個JSON請求

{ 
    "name": "Test", 
    "release_date": "1979-01-01", 
    "rating": 5, 
    "comment": "Terrible Game!", 
    "publisher": "Me" 

}

models.py

class Publisher(models.Model): 
    name = models.CharField(max_length=100) 

    def __unicode__(self): 
     return self.name 

class Game(models.Model): 
    name = models.CharField(max_length=100) 
    release_date = models.DateField(null=True, blank=True) 
    rating = models.IntegerField(
     null=True, blank=True, 
     validators=[MinValueValidator(0), MaxValueValidator(5)]) 
    comment = models.TextField(null=True, blank=True) 
    publisher = models.ForeignKey(Publisher, null=True, blank=True) 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     ordering = ('name',) 

serial izers.py

from rest_framework import serializers 
from game.models import Game, Publisher 

class GameSerializer(serializers.ModelSerializer): 
    publisher = serializers.PrimaryKeyRelatedField(allow_null=True, queryset=Publisher.objects.all(), required=False) 

    class Meta: 
     model = Game 
     fields = ('pk','name', 'release_date', 'rating', 'comment', 'publisher') 

    def create(self, validated_data): 
     """ 
     Create and return a new 'Game' instance, given the validated data. 
     """ 
     return Game.objects.create(**validated_data) 

    def update(self, instance, validated_data): 
     """ 
     Update and return an existing 'Game' instance, given the validated data. 
     """ 
     instance.name = validated_data.get('name', instance.name) 
     instance.release_date = validated_data.get('release_date',instance.release_date) 
     instance.rating = validated_data.get('rating', instance.rating) 
     instance.comment = validated_data.get('comment', instance.comment) 
     instance.publisher = validated_data.get('publisher', instance.publisher) 
     instance.save() 
     return instance 

views.py

class GameDetail(APIView): 
    """ 
    Retrieve, update or delete a game instance. 
    """ 
    def get_object(self,pk): 
     try: 
      return Game.objects.get(pk=pk) 
     except Game.DoesNotExist: 
      raise Http404 

    def get(self, request, pk, format=None): 
     game = self.get_object(pk) 
     serializer = GameSerializer(game) 
     return Response(serializer.data) 

    def put(self, request, pk, format=None): 
     game = self.get_object(pk) 
     serializer = GameSerializer(game, data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    def delete(self, request, pk, format=None): 
     game = self.get_object(pk) 
     game.delete() 
     return Response(status=status.HTTP_204_NO_CONTENT) 

回答

1

你發送一個字符串( 「我」)作爲發佈者的屬性。這就是爲什麼你會得到你的"Incorrect type. Expected pk value, received unicode."錯誤。

由於publisher是您的Game模型中的ForeignKey,因此您必須先將「Me」Publisher的實例保存到數據庫中。

一個可行的方法是修改您的序列化的update()方法和尋找正確的實例:

instance.publisher = Publisher.objects.get_or_create(name=validated_data.get('publisher'))
,然後調用 instance.save()