使用ManyToManyFiled POST到Django模型会给出不正确的类型。预期的pk值,

时间:2016-04-25 18:27:52

标签: javascript django

我正在尝试研究如何对包含ManyToManyField的Django模型进行POST。除了ManyToManyField抛出不正确的类型错误(预期的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)

POST API调用的Django REST Framework视图是:

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

进行POST API调用的Javascript代码如下所示:

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

1 个答案:

答案 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)