首頁 >後端開發 >Python教學 >Pydantic:將整個資料集傳遞到嵌套字段

Pydantic:將整個資料集傳遞到嵌套字段

王林
王林轉載
2024-02-05 21:24:12603瀏覽

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刪除