POST to Django 模型与 ManyToManyFiled 给出不正确的类型.预期 pk 值,

POST to Django model with ManyToManyFiled gives Incorrect type. Expected pk value,

本文关键字:类型 预期 pk 不正确 Django to 模型 ManyToManyFiled POST      更新时间:2023-09-26

我正在尝试研究如何对包含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 框架视图是:

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

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)