Home  >  Article  >  Backend Development  >  Pydantic: Pass entire dataset to nested field

Pydantic: Pass entire dataset to nested field

王林
王林forward
2024-02-05 21:24:12539browse

Pydantic: Pass entire dataset to nested field

Question content

I am using django, the django-ninja framework to replace some of my apis (written in drf as it becomes more boilerplate Code library). Now, while converting some legacy apis, I need to follow the old structure so that clients don't face any issues. This is just backstory.

I have two separate models.

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

In the viewset, the following queryset will be passed

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

So, when I switched to django-ninja, it used pydantic for schema generation. I have the following pydantic pattern code

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


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


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

But as you can see, the drf serializer has a parameter called source, where source="*" means passing the entire original data set to the embedded Set of field serializers. Are there any options to do the exact same thing with pydantic?

In addition to creating a dictionary list for the blogs in the query set [{author: blog.author, "blog": blog}]


Correct answer


Use the following code solved the problem

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

The above is the detailed content of Pydantic: Pass entire dataset to nested field. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete