问题内容 我正在使用 Django、djanGo-ninja 框架来替换我的一些 api(用 drf 编写,因为它变得更像样板代码库)。现在,在转换一些旧版 api 时,我需要遵循旧的
我正在使用 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:将整个数据集传递到嵌套字段的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: Pydantic:将整个数据集传递到嵌套字段
本文链接: https://lsjlt.com/news/561078.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0