2016-04-25 38 views
0

我正在試圖找出如何對包含ManyToManyField的Django模型執行POST。除了拋出錯誤的類型錯誤(期望的pk值)的ManyToManyField之外,一切似乎都奏效。使用ManyToManyFiled向Django模型發佈POST錯誤類型。期望pk值,

我,我張貼到的主要模式是:

class Item(models.Model): 
 

 
    owner   = models.ForeignKey(User, on_delete=models.CASCADE)  
 
    title   = models.CharField(max_length=60, default='')   
 
    url    = models.CharField(max_length=250, default='', unique=True)                 
 
    keywords  = models.ManyToManyField(Keyword, related_name='keywords') 
 
                     

相關的關鍵字模式是:

class Keyword(models.Model): 
 
    name = models.CharField(max_length=30) 
 

 
    def __str__(self): 
 
     return format(self.name)

的Djan去REST框架視圖的POST API調用:

class ItemViewSet(viewsets.ModelViewSet): 
 
    queryset = Item.objects.all().order_by('-date_added') 
 
    serializer_class = ItemSerializer 
 

 
    def perform_create(self, serializer): 
 
     creator = User.objects.get(pk=self.request.data['owner_id']) 
 
     the_keywords = self.request.data['keywords'].split 
 
     serializer.save(owner=creator) 
 
     serializer.save(keywords=the_keywords)

串行器是:

class ItemSerializer(serializers.ModelSerializer): 
 
    username = serializers.SerializerMethodField() 
 

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

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

 
    class Meta: 
 
     model = Item 
 
     fields = ('id', 'url', 'item_type', 'title', 'keywords')

的JavaScript代碼,使POST API調用看起來像這樣:

submitImage(url,title,categories){ 
 

 
     var userID = 18; 
 

 
     //console.log('in stuff'); 
 

 
     let body = JSON.stringify({url: url, owner_id: serID, title: title, keywords: categories}); 
 

 
     console.log('BODY: '+body); 
 

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

 
     this.http.post(API_ENDPOINT+'items/ ', 
 
     body, { 
 
      headers: headers 
 
     }) 
 
     .map(res => res.json()) 
 
     .subscribe(
 
      data => { 
 
      
 
      }, 
 
      err => { 
 
      alert('ERROR from submitImage() API call: ' + JSON.stringify(err)); 
 
      }, 
 
     () => { 
 
      
 
      } 
 
     ); 
 
    }); 
 
    }

調用此函數如下:

 var categories = ['news','politics']; 
 
    submitImage('http://www.url.com/item','Test item',categories);

+0

您是否嘗試過將'save_m2m = True'傳遞給您的保存方法?https://github.com/tomchristie/django-rest-framework/issues/1556 – noonkay

+0

我會在哪裏做到這一點? –

回答

0
class keywordSerializer(serializers.ModelSerializer): 

    class Meta: 
     model:Keyword 
     fields:('name') 

class ItemSerializer(serializers.ModelSerializer): 
    keywords = keywordSerializer() 

    class Meta: 
     model = Item 
     fields = ('id', 'url', 'item_type', 'title', 'keywords') 

和您的看法是這樣的:

class ItemViewSet(viewsets.ModelViewSet): 
    queryset = Item.objects.all().order_by('-date_added') 
    serializer_class = ItemSerializer 

    def perform_create(self, serializer): 
     creator = User.objects.get(pk=self.request.data['owner_id']) 
     the_keywords = self.request.data['keywords'].split 
     serializer.save(owner=creator) 
+0

謝謝gentos。那我的代碼會在哪裏?序列化程序中的 –

+0

。 – 2016-04-25 22:30:08

+0

在def get_keywords()函數中,而不是value = str()? –