Django rest framework 如何从m2m模型关系中预先选择自定义DRF MultipleChiiceField中的选项?

Django rest framework 如何从m2m模型关系中预先选择自定义DRF MultipleChiiceField中的选项?,django-rest-framework,django-serializer,Django Rest Framework,Django Serializer,MyBook模型可以通过m2m关系将标记模型与其关联,这些标记通常通过FK标记类别模型进一步分类 类别标记类别(models.Model): name=models.CharField(…) 类标记(models.Model): name=models.CharField(…) 类别=型号。外键(to=TagCategory,…) 教材(models.Model): tags=models.ManyToManyField(to=Tag,…) 使用来自DRF的序列化程序,我希望BookSeria

My
Book
模型可以通过m2m关系将
标记
模型与其关联,这些标记通常通过FK
标记类别
模型进一步分类

类别标记类别(models.Model):
name=models.CharField(…)
类标记(models.Model):
name=models.CharField(…)
类别=型号。外键(to=TagCategory,…)
教材(models.Model):
tags=models.ManyToManyField(to=Tag,…)
使用来自DRF的序列化程序,我希望
BookSerializer
提供一个
multiplechicefield
,供最终用户从中选择多个标记。如果我使用
serializer.ModelSerializer
并且不碰任何东西,它就可以正常工作

但实际上,我想按类别对标记/选项进行分组,这不是默认行为,因此我必须定义自己的
multipleechoicefield
,并在
choices
中对选项进行分组,并提醒字段从
Book
模型的正确属性获取其
源代码:

class BookSerializer(serializers.ModelSerializer):
tags\u input=serializers.multipleechoicefield(
选择=[
[category.name,[[tag.pk,tag.name]
对于category.tags.all()]中的标记对于category.objects.all()]中的类别,
source=“tags”,
只写=真,
)
字段=(“标记\输入”,)
这对于创建
书籍
模型和通过m2m分配标签似乎很有效。但是,当使用标记序列化现有模型以进行更新时,初始标记/选项不会按预期预先选择。设置
initial=“tags”
似乎不会改变任何东西


在序列化模型时,我如何才能成功地从
Book.tags
中检索和预选标记/选项?

好吧,所以我的困惑是,
ModelSerializer
将实际使用
multipleechoicefield
,这样我就可以自己找到它并定义它:不。
tags
是一种m2m关系,所以我需要一个
RelatedField
,其中包含
many=True

首先,由于我是从同一个模型字段序列化和反序列化的,所以我不应该做我提出的
tags\u input
解决方法。我需要一个能做所有事情的字段:

类标记ChoiceRelatedField(序列化程序.相关字段):
queryset=Tags.objects.all()
def到_表示(自身、值):
返回值.pk
def get_选项(自,截止=无):
返回{
类别名称:
{tag.pk:category.tags.all()中标记的tag.name}
用于TagCategory.objects.all()中的类别
}
def至_内部_值(自身、数据):
尝试:
tag=self.get\u queryset().get(pk=data)
除ObjectDoesNotExist外:
引发ValidationError()
返回标签
类BookSerializer(serializers.ModelSerializer):
tags=TagChoiceRelatedField(多个=真)
类元:
字段=(“标记”,)
序列化程序现在使用该字段执行以下操作:

  • 预期序列化每个标记及其pk(to_表示)
  • 预期使用pk(to_internal_值)反序列化每个标记
  • 根据标签/选项的类别对其进行分组(获取选项)
  • 最后使用book实例的标记(如果适用)初始化后者(内部)