gpt4 book ai didi

python - 如何在 DRF 中通过一个请求创建多个对象(相关)?

转载 作者:行者123 更新时间:2023-11-28 16:34:23 25 4
gpt4 key购买 nike

我有一个类代表一个作业,一个类代表一个标签,它描述了一个作业,然后我有一个类在它们之间建立关系(连接表),所以一个作业可以由多个标签描述:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com