我有一類代表一個工作,代表標籤,其描述了作業和一個類,那麼我在它們之間具有類製作的關係(結合表),所以作業可以由多個標籤來描述:如何用DRF中的一個請求創建多個對象(相關)?
class JobTag(models.Model):
job = models.ForeignKey(Job, unique=False, related_name='jobtags')
tag = models.ForeignKey(Tag, unique=False, related_name='Tag_For_Job')
created_time = models.DateTimeField(auto_now_add = True)
modified_time = models.DateTimeField(auto_now = True)
class Meta:
unique_together = ('job', 'tag',)
def __unicode__(self):
return 'Tag '+self.tag.name +' for job '+ self.job.name
然後,我有串行:
class TagSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Tag
fields = ('url','name','badge_pic')
read_only_fields = ('name','badge_pic')
class JobTagSerializer(serializers.HyperlinkedModelSerializer):
tag = TagSerializer()
class Meta:
model = JobTag
fields = ('tag',)
depth=1
class JobSerializer(serializers.HyperlinkedModelSerializer):
jobtags=JobTagSerializer(many=True)
class Meta:
model = Job
fields = ('url','name', 'employer','jobtags','description')
read_only_fields = ('employer',)
因此,對GET請求的HTTP響應:
{
"url": "http://127.0.0.1:8000/api/jobs/2/",
"name": "Odprac mi sneh",
"employer": "http://127.0.0.1:8000/api/users/4/",
"jobtags": [
{
"tag": {
"url": "http://127.0.0.1:8000/api/tags/2/",
"name": "Odhadzovanie snehu",
"badge_pic": "http://127.0.0.1:8000/media/pictures/tags/0005.jpg"
}
}
],
"description": "blablabla"
}
我的問題是預tty非常明顯,我如何創建一個工作實例,並用一個POST HTTP請求將它們與相關的JobTags持久存儲?
我試圖重複這個方法http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations。
class JobSerializer(serializers.HyperlinkedModelSerializer):
jobtags=JobTagSerializer(many=True)
class Meta:
model = Job
fields = ('url','name', 'employer','jobtags','description')
read_only_fields = ('employer',)
def create(self, validated_data):
jobtag_data = validated_data.pop('jobtags')
job = Job.objects.create(**validated_data)
JobTag.objects.create(job=job, **jobtag_data)
return job
又恢復「創造(的)參數**後必須是一個映射,未列出」的錯誤,所以我應該request.data JSON樣子?
或者這種方法不能用於我的情況,我應該做一些完全不同的事情嗎?
我將不勝感激任何幫助。
編輯
,如果我嘗試訪問列表:
def create(self, validated_data):
jobtag_data = validated_data.pop('jobtags')
job = Job.objects.create(**validated_data)
JobTag.objects.create(job=job, **jobtag_data[0])
return job
我創另一個錯誤: 「不能分配 」OrderedDict()「: 」JobTag.tag「 必須是一個」 標籤「例子」。 所以即時猜測我發佈的json格式錯誤?我試圖topost數據是這樣的:
{
"name": "Odprac mi sneh",
"jobtags": [
{
"tag": {
"url": "http://127.0.0.1:8000/api/tags/2/"
}
}
],
"description": "veela sneu nemam ruky makam makam makamam",
}
您是否可以不遍歷'jobtag_data'併爲每個項目創建一個'JobTag'實例? – Fiver 2015-02-09 22:43:25
它看起來像驗證數據中的工作標籤由一些OrdedDict代表,這是不可接受的,我編輯了問題 – 2015-02-09 22:53:45