gpt4 book ai didi

django - 在 Django rest 框架中转换 `ManyToManyField`

转载 作者:行者123 更新时间:2023-12-04 21:16:42 26 4
gpt4 key购买 nike

我正在使用 Django-rest-framework 来构建 API。我有一个模型 Chair我正在构建一个 View 集。它有一个 ManyToManyField给模型 Tag ,所以每把椅子都有多个标签。
Tag是一个 Django 模型,但是在与 API 交互时,我不想看到每个标签的 JSON dict;我只想使用标签的名称。

例如。查看 Chair 时在 API 中,我想看到它有这个:

{
'tags': ['meow', 'frrr', 'nutella'],
... Any other chair attributes
}

同样,当我创建一个 Chair 时,我希望能够传入一个标签名称列表,然后为每个标签名称做 get_or_create以那个名字。 (所以我要么使用具有该名称的现有标签,要么创建一个新标签。)

如何将所有这些逻辑放入我的序列化程序/ View 集中?

最佳答案

在序列化程序中定义您的标签字段,如下所示:

tags = serializers.SlugRelatedField(slug_field='name', many=True)

现在对于 get_or_create 行为,我的建议是使用 django 表单。您将必须覆盖 post 方法(如果您使用的是 View 集,则必须覆盖 create 方法)并编写一个普通的 django 方法来使用表单创建内容。

看看 request.DATA 它是一个普通的 python 字典,将它用作椅子表单的数据。

表单将接受此数据,然后您可以正常验证数据,就像使用 django 表单一样。

然后使用以下命令创建一个椅子实例:
chair = form.save(commit=False)
chair.save()

一旦你有了椅子实例,你就可以使用以下方法添加尽可能多的标签:
chair.tags.add(tag1, tag2, tag3...)

要将标签作为 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)

现在你有了标签列表。将它们添加到椅子上:
chair.tags.add(*tags)

关于django - 在 Django rest 框架中转换 `ManyToManyField`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21883505/

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