作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类代表一个作业,一个类代表一个标签,它描述了一个作业,然后我有一个类在它们之间建立关系(连接表),所以一个作业可以由多个标签描述:
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 请求将它们与相关的 JobTag 持久化?
我试着重复这个方法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() argument after ** must be a mapping, not list”错误,那么 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”必须是一个“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",
}
最佳答案
我认为您应该在 POST 数据中提供每个标签的 id
而不是 url
,如下所示:
{
"name": "Odprac mi sneh",
"tags": [
{
"id": 2
},
{
"id": 3
}
],
"description": "veela sneu nemam ruky makam makam makamam"
}
然后,在您的 create
方法中,您应该能够遍历标签:
def create(self, validated_data):
tag_data = validated_data.pop('tags')
job = Job.objects.create(**validated_data)
for tag in tag_data:
JobTag.objects.create(job=job, tag_id=tag["id"])
return job
关于python - 如何在 DRF 中通过一个请求创建多个对象(相关)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420802/
我是一名优秀的程序员,十分优秀!