我正在使用 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:将整个数据集传递到嵌套字段的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756