首页 >后端开发 >Python教程 >Pydantic:将整个数据集传递到嵌套字段

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

王林
王林转载
2024-02-05 21:24:12575浏览

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

问题内容

我正在使用 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中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除