我有一个类代表一个作业,一个类代表一个标签,它描述了一个作业,然后我有一个类在它们之间建立了关系(联结表),因此一个作业可以由多个标签来描述:
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"
}
我的问题非常明显,如何创建一个作业实例并通过一个 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
但它返回了“**之后的 create() 参数必须是映射,而不是列表”错误,那么 request.data json 应该是什么样子?
或者这种方法不能用于我的情况,我应该做一些完全不同的事情吗?
我将不胜感激任何帮助。
Edit
如果我尝试访问该列表:
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”必须是“Tag”实例。”
所以我猜我发布的 json 格式错误?我尝试以这种方式发布数据:
{
"name": "Odprac mi sneh",
"jobtags": [
{
"tag": {
"url": "http://127.0.0.1:8000/api/tags/2/"
}
}
],
"description": "veela sneu nemam ruky makam makam makamam",
}