Heim >Backend-Entwicklung >Python-Tutorial >Pydantic: Übergeben Sie den gesamten Datensatz an ein verschachteltes Feld

Pydantic: Übergeben Sie den gesamten Datensatz an ein verschachteltes Feld

王林
王林nach vorne
2024-02-05 21:24:12601Durchsuche

Pydantic: Übergeben Sie den gesamten Datensatz an ein verschachteltes Feld

Frageninhalt

Ich verwende Django, das Django-Ninja-Framework, um einige meiner APIs zu ersetzen (in DRF geschrieben, da es eher zu einer Standardcodebasis wird). Jetzt muss ich bei der Konvertierung einiger älterer APIs der alten Struktur folgen, damit Kunden keine Probleme haben. Das ist nur eine Hintergrundgeschichte.

Ich habe zwei separate Modelle.

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

Struktur geschrieben vom Django Rest Framework Serializer

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()

Im Viewset wird das folgende Abfrageset übergeben

class blogviewset(viewsets.genericviewset, listviewmixin):
    queryset = blog.objects.all()
    serializer_class = blogserializer
    ... # other config

Als ich also zu Django-Ninja wechselte, verwendete es Pydantic für die Schemagenerierung. Ich habe den folgenden pydantischen Mustercode

AuthorSchema = create_schema(Author, exclude=["updated", "date_joined"])


class BlogBaseSchema(ModelSchema):
    class Meta:
        model = Blog
        exclude = ["author", ]


class BlogSchema(Schema):
    blog: BlogBaseSchema
    author: AuthorSchema

Aber wie Sie sehen können, verfügt der DRF-Serializer über einen Parameter namens source的参数,其中source="*", der bedeutet, dass der gesamte Originaldatensatz an den Serializer für verschachtelte Felder übergeben wird. Gibt es Möglichkeiten, mit Pydantic genau das Gleiche zu tun?

Zusätzlich zum Erstellen einer Wörterbuchliste für die Blogs im Abfragesatz [{author: blog.author, "blog": blog}]


Richtige Antwort


Die Verwendung des folgenden Codes hat das Problem gelöst

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

Das obige ist der detaillierte Inhalt vonPydantic: Übergeben Sie den gesamten Datensatz an ein verschachteltes Feld. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen