2016-04-06 17 views
2

Neden Django REST framework bir int bekliyor olması gerektiğinde bir dize bekliyor umuyor olduğunu bilemiyorum! Ben alıyorum hatadır:Django, API çağrısı "Yanlış tür. Beklenen URL dizesi" atıyor

{"_body":"{\"who_saw\":[\"Incorrect type. Expected URL string, received int.\"],\"item_seen\":[\"Incorrect type. Expected URL string, received int.\"]}","status":400,"statusText":"Ok","headers":{"Content-Type":["application/json;q=0.8"]},"type":2,"url":"http://127.0.0.1:8000/api/seen/"}
Django DİNLENME Çerçeve sunucusuna bir uygulamadan bir POST isteği yapmak için aşağıdaki Eğik 2 http kodunu kullanıyorum

:

let body = JSON.stringify({ item_seen: 1, who_saw: 2, liked: 0 }); 
 

 
    let headers = new Headers(); 
 
    headers.append('Content-Type', 'application/json'); 
 

 
    this.http.post('http://127.0.0.1:8000/api/seen/', 
 
     body, { 
 
      headers: headers 
 
     }) 
 
     .map(res => res.json()) 
 
     .subscribe(
 
      data => { 
 
       alert('DATA: '+JSON.stringify(data)); 
 
      }, 
 
      err => { 
 
       alert('ERROR: '+JSON.stringify(err)); 
 
      }, 
 
      () => { 
 
       alert('Complete'); 
 
      } 
 
     );

Benim modelidir:

class Seen(models.Model): 
 
    item_seen   = models.ForeignKey(Item, on_delete=models.CASCADE)  # id of the item that has been seen 
 
    who_saw    = models.ForeignKey(User, on_delete=models.CASCADE)  # id of user who viewed it 
 
    date_seen   = models.DateTimeField(auto_now_add=True)    # When item was viewed 
 
    liked    = models.BooleanField(help_text='If the item was liked this is set to true')

Benim Görünüm geçerli:

class SeenViewSet(viewsets.ModelViewSet): 
 
    queryset = Seen.objects.all().order_by('-date_seen') 
 
    serializer_class = SeenSerializer 
 

 
    def perform_create(self, serializer): 
 
     the_user = User.objects.get(pk=self.request.data['who_saw']) 
 
     serializer.save(who_saw=the_user) 
 

 
     the_item = Item.objects.get(pk=self.request.data['item_seen']) 
 
     serializer.save(item_seen=the_item)

Ve serileştirici geçerli:

class SeenSerializer(serializers.HyperlinkedModelSerializer): 
 
    username = serializers.SerializerMethodField() 
 

 
    def get_username(self, obj): 
 
     value = str(obj.who_saw) 
 
     return value 
 

 
    def get_keywords(self, obj): 
 
     value = str(obj.keywords) 
 
     return value 
 

 
    class Meta: 
 
     model = Seen 
 
     fields = ('who_saw', 'item_seen', 'liked', 'date_seen', 'username')

cevap

7

sorun Bir serializers.HyperlinkedModelSerializer kullanıyorsanız yani, sen serializers.ModelSerializer kullanın veya bir int gönderiyoruz kimliğinin linki göndermelidir.

+0

Evet! Bu kadar! Şimdi mükemmel çalışıyor. –

İlgili konular