我正在使用 django、django-ninja 框架来替换我的一些 api(用 drf 编写,因为它变得更像样板代码库)。现在,在转换一些旧版 api 时,我需要遵循旧的结构,这样客户端就不会遇到任何问题。这只是背景故事。
我有两个独立的模型。
class author(models.model): username = models.charfield(...) email = models.charfield(...) ... # other fields class blog(models.model): title = models.charfield(...) text = models.charfield(...) tags = models.charfield(...) author = models.foreignkey(...) ... # other fields
django rest框架序列化器编写的结构
class blogbaseserializer(serializers.serializer): class meta: model = blog exclude = ["author"] class authorserializer(serializers.serializer): class meta: model = author fields = "__all__" class blogserializer(serializers.serializer): blog = blogbaseserializer(source="*") author = authorserializer()
在视图集中,将传递以下查询集
class blogviewset(viewsets.genericviewset, listviewmixin): queryset = blog.objects.all() serializer_class = blogserializer ... # other config
所以,当我切换到 django-ninja 时,它使用 pydantic 进行模式生成。 我有以下 pydantic 模式代码
AuthorSchema = create_schema(Author, exclude=["updated", "date_joined"]) class BlogBaseSchema(ModelSchema): class Meta: model = Blog exclude = ["author", ] class BlogSchema(Schema): blog: BlogBaseSchema author: AuthorSchema
但是正如你所看到的,drf序列化器有一个名为source
的参数,其中source="*"
表示将整个原始数据集传递给嵌套字段序列化器。是否有任何选项可以对 pydantic 执行完全相同的操作?
除了为查询集中的博客创建字典列表 [{author: blog.author, "blog": blog}]
使用以下代码解决了问题
class AuthorSchema(ModelSchema): class Meta: model = Author exclude=["updated", "date_joined"] class BlogBaseSchema(ModelSchema): class Meta: model = Blog exclude = ["author", ] class BlogSchema(Schema): blog: BlogBaseSchema author: AuthorSchema @staticmethod def resolve_blog(self, obj): return obj
以上是Pydantic:将整个数据集传递到嵌套字段的详细内容。更多信息请关注PHP中文网其他相关文章!