PHP前端开发

Pydantic:将整个数据集传递到嵌套字段

百变鹏仔 1天前 #Python
文章标签 嵌套
问题内容

我正在使用 django、django-ninja 框架来替换我的一些 api(用 drf 编写,因为它变得更像样板代码库)。现在,在转换一些旧版 api 时,我需要遵循旧的结构,这样客户端就不会遇到任何问题。这只是背景故事。

我有两个独立的模型。

class author(models.model):   username = models.charfield(...)   email = models.charfield(...)   ... # other fieldsclass 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