Ram*_*hum 5 api django rest django-rest-framework
我正在使用Django-rest-framework构建API。我有一个Chair要为其构建视图集的模型。它对ManyToManyField模型具有Tag,因此每把椅子都有多个标签。
Tag是Django模型,但在与API交互时,我不想看到每个标签的JSON dict;我只想使用标签的名称。
例如Chair,在API中查看时,我希望看到它具有以下内容:
{
'tags': ['meow', 'frrr', 'nutella'],
... Any other chair attributes
}
Run Code Online (Sandbox Code Playgroud)
同样,当我创建一个时Chair,我希望能够传递一个标签名称列表,然后对每个标签名称都get_or_create使用该名称。(因此,我要么使用具有该名称的现有标签,要么创建一个新标签。)
如何将所有这些逻辑放入序列化器/视图集?
在序列化器中定义标签字段如下:
tags = serializers.SlugRelatedField(slug_field='name', many=True)
Run Code Online (Sandbox Code Playgroud)
现在,对于 get_or_create 行为,我的建议是使用 django 表单。您必须重写 post 方法(如果您使用的是视图集,则必须重写 create 方法)并编写一个普通的 django 方法来使用表单创建内容。
看看request.DATA,它是一个普通的python字典,用它作为你的椅子表格的数据。
该表单将接受此数据,然后您可以正常验证数据,就像使用 django 表单一样。
然后使用以下命令创建一个椅子实例:
chair = form.save(commit=False)
chair.save()
Run Code Online (Sandbox Code Playgroud)
一旦您拥有了椅子实例,您就可以使用以下方法添加任意数量的标签:
chair.tags.add(tag1, tag2, tag3...)
Run Code Online (Sandbox Code Playgroud)
要将标签作为 python 对象获取,请从 request.DATA 字典中取出标签名称列表,并将名称传递给 get_or_create 函数。你可以这样做:
tags = []
tags_name_list = request.DATA['tags']
for tag_name in tags_name_list:
tag = Tag.objects.get_or_create(name=tag_name)
tags.append(tag)
Run Code Online (Sandbox Code Playgroud)
现在您已经有了标签列表。将它们添加到椅子上:
chair.tags.add(*tags)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
832 次 |
| 最近记录: |