我正在尝试研究如何对包含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);
答案 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)