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

王林
Freigeben: 2024-02-05 21:24:12
nach vorne
547 Leute haben es durchsucht

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
Nach dem Login kopieren

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()
Nach dem Login kopieren

Im Viewset wird das folgende Abfrageset übergeben

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

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!