2016-04-10 21 views
1

Django'yu öğreniyorum ve Django REST framework'ü kullanarak bir Game REST API'si oluşturmaya çalışıyorum. Yayıncı alanını nasıl güncelleyeceğimi bilmiyorum. Yayıncı sınıfım için başka bir Serializer oluşturmam gerekiyor ve bir kaydetme yöntemi uygulamak?PrimaryKeyRelatedField üzerinde bir PUT isteği gönderilemiyor

Ben bir PUT isteği göndermek için postacı kullanıyorum ve bu recieving am:

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

Ben bir JSON isteği

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

} gönderirken

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

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

cevap

1

Sen yayıncı niteliği olarak bir dize ("Me") yolluyoruz

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 

izers.py. Bu yüzden, "Incorrect type. Expected pk value, received unicode." hatasını karşılıyor. publisher yana

sizin Game modelinde bir ForeignKey, veritabanınızda kaydetmeden önce "Bana" Publisher örneğini almak gerekecek olduğunu.

instance.publisher = Publisher.objects.get_or_create(name=validated_data.get('publisher'))
ve sonra instance.save() çağrı:

Olası bir yaklaşım serileştiriciye içinde update() yöntemini değiştirmek ve sağ örneğine aramak içindir.

İlgili konular