Maison  >  Article  >  développement back-end  >  Pydantic : transmettre l'intégralité de l'ensemble de données au champ imbriqué

Pydantic : transmettre l'intégralité de l'ensemble de données au champ imbriqué

王林
王林avant
2024-02-05 21:24:12573parcourir

Pydantic : transmettre lintégralité de lensemble de données au champ imbriqué

Contenu de la question

J'utilise Django, le framework Django-ninja pour remplacer certaines de mes API (écrites en drf car il devient davantage une base de code passe-partout). Désormais, lors de la conversion de certaines API héritées, je dois suivre l'ancienne structure afin que les clients ne rencontrent aucun problème. Ce n’est qu’une histoire.

J'ai deux modèles distincts.

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

Structure écrite par le sérialiseur Django Rest Framework

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

Dans l'ensemble de vues, l'ensemble de requêtes suivant sera transmis

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

Ainsi, lorsque je suis passé à Django-Ninja, il utilise pydantic pour la génération de schémas. J'ai le code de modèle pydantique suivant

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


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


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

Mais comme vous pouvez le voir, le sérialiseur drf a un paramètre appelé source的参数,其中source="*" qui signifie transmettre l'intégralité de l'ensemble de données d'origine au sérialiseur de champs imbriqués. Existe-t-il des options pour faire exactement la même chose avec pydantic ?

En plus de créer une liste de dictionnaires pour les blogs dans l'ensemble de requêtes [{author : blog.author, "blog": blog}]


Réponse correcte


L'utilisation du code suivant a résolu le problème

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer