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}]
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!