Pydantic: Pass entire dataset to nested field

王林
Release: 2024-02-05 21:24:12
forward
572 people have browsed it

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
Copy after login

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()
Copy after login

In the viewset, the following queryset will be passed

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

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
Copy after login

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
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template