In Django, a ModelSerializer is a powerful feature provided by the Django REST framework (DRF) that simplifies the process of serializing and deserializing Django model instances to and from JSON format. It automatically generates serializer classes for Django models, reducing the amount of boilerplate code required to handle serialization and deserialization.
A ModelSerializer inherits from the Serializer class provided by DRF and is specifically designed to work with Django models. It provides default implementations for most of the serialization and deserialization operations, making it easy to work with complex models.
To use ModelSerializer, you need to define a serializer class for each Django model you want to expose through your API. The serializer class is typically defined within the serializers.py file in your app.
<span># models.py </span><span>from</span> <span>django.db</span> <span>import</span> <span>models</span><span>class</span> <span>Author</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span><span>name</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span><span>email</span> <span>=</span> <span>models</span><span>.</span><span>EmailField</span><span>()</span><span>class</span> <span>Book</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span><span>title</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>200</span><span>)</span><span>author</span> <span>=</span> <span>models</span><span>.</span><span>ForeignKey</span><span>(</span><span>Author</span><span>,</span> <span>on_delete</span><span>=</span><span>models</span><span>.</span><span>CASCADE</span><span>)</span><span>published_date</span> <span>=</span> <span>models</span><span>.</span><span>DateField</span><span>()</span><span>is_published</span> <span>=</span> <span>models</span><span>.</span><span>BooleanField</span><span>(</span><span>default</span><span>=</span><span>False</span><span>)</span><span># models.py </span><span>from</span> <span>django.db</span> <span>import</span> <span>models</span> <span>class</span> <span>Author</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span> <span>name</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span> <span>email</span> <span>=</span> <span>models</span><span>.</span><span>EmailField</span><span>()</span> <span>class</span> <span>Book</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span> <span>title</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>200</span><span>)</span> <span>author</span> <span>=</span> <span>models</span><span>.</span><span>ForeignKey</span><span>(</span><span>Author</span><span>,</span> <span>on_delete</span><span>=</span><span>models</span><span>.</span><span>CASCADE</span><span>)</span> <span>published_date</span> <span>=</span> <span>models</span><span>.</span><span>DateField</span><span>()</span> <span>is_published</span> <span>=</span> <span>models</span><span>.</span><span>BooleanField</span><span>(</span><span>default</span><span>=</span><span>False</span><span>)</span># models.py from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author, on_delete=models.CASCADE) published_date = models.DateField() is_published = models.BooleanField(default=False)
Enter fullscreen mode Exit fullscreen mode
Now, let’s create a ModelSerializer for the Book
model:
<span># serializers.py </span><span>from</span> <span>rest_framework</span> <span>import</span> <span>serializers</span><span>from</span> <span>.models</span> <span>import</span> <span>Book</span><span>class</span> <span>BookSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span><span>class</span> <span>Meta</span><span>:</span><span>model</span> <span>=</span> <span>Book</span><span>fields</span> <span>=</span> <span>'__all__'</span><span># serializers.py </span><span>from</span> <span>rest_framework</span> <span>import</span> <span>serializers</span> <span>from</span> <span>.models</span> <span>import</span> <span>Book</span> <span>class</span> <span>BookSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span> <span>class</span> <span>Meta</span><span>:</span> <span>model</span> <span>=</span> <span>Book</span> <span>fields</span> <span>=</span> <span>'__all__'</span># serializers.py from rest_framework import serializers from .models import Book class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = '__all__'
Enter fullscreen mode Exit fullscreen mode
In the above code, we have a Book
model with three fields (title
, author
, and published_date
). The BookSerializer
is a ModelSerializer that maps to the Book
model and includes all fields in the serialization.
Now, let’s explore the fields and options in the Meta class of the ModelSerializer:
-
model
:- Specifies the Django model associated with the serializer.
-
fields
:- Use
fields
to include specific fields from the model in the serializer. - Special values for
fields
:-
'__all__'
: Includes all fields from the model in the serializer. -
['field1', 'field2', ...]
: Includes only the specified fields from the model in the serializer. -
('field1', 'field2', ...)
: Same as the list format, includes only the specified fields from the model. -
[]
: Excludes all fields from the model. You can manually include specific fields in the serializer.
-
- Use
-
exclude
:- Use
exclude
to specify fields that should be excluded from the serializer.
- Use
<span># Example with 'fields' and 'exclude': </span><span>class</span> <span>BookSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span><span>class</span> <span>Meta</span><span>:</span><span>model</span> <span>=</span> <span>Book</span><span>fields</span> <span>=</span> <span>[</span><span>'title'</span><span>,</span> <span>'published_date'</span><span>]</span><span># exclude = ['is_published'] </span><span># Example with 'fields' and 'exclude': </span><span>class</span> <span>BookSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span> <span>class</span> <span>Meta</span><span>:</span> <span>model</span> <span>=</span> <span>Book</span> <span>fields</span> <span>=</span> <span>[</span><span>'title'</span><span>,</span> <span>'published_date'</span><span>]</span> <span># exclude = ['is_published'] </span># Example with 'fields' and 'exclude': class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = ['title', 'published_date'] # exclude = ['is_published']
Enter fullscreen mode Exit fullscreen mode
-
read_only_fields
:- Use
read_only_fields
to specify fields that should be read-only when deserializing the data. These fields won’t be included in the update or create operations.
- Use
<span># Example with 'read_only_fields': </span><span>class</span> <span>BookSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span><span>class</span> <span>Meta</span><span>:</span><span>model</span> <span>=</span> <span>Book</span><span>fields</span> <span>=</span> <span>'__all__'</span><span>read_only_fields</span> <span>=</span> <span>[</span><span>'is_published'</span><span>]</span><span># Example with 'read_only_fields': </span><span>class</span> <span>BookSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span> <span>class</span> <span>Meta</span><span>:</span> <span>model</span> <span>=</span> <span>Book</span> <span>fields</span> <span>=</span> <span>'__all__'</span> <span>read_only_fields</span> <span>=</span> <span>[</span><span>'is_published'</span><span>]</span># Example with 'read_only_fields': class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = '__all__' read_only_fields = ['is_published']
Enter fullscreen mode Exit fullscreen mode
-
extra_kwargs
:- Use
extra_kwargs
to provide extra options for specific fields, such as custom validation, formatting, etc.
- Use
<span># Example with 'extra_kwargs': </span><span>class</span> <span>BookSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span><span>class</span> <span>Meta</span><span>:</span><span>model</span> <span>=</span> <span>Book</span><span>fields</span> <span>=</span> <span>'__all__'</span><span>extra_kwargs</span> <span>=</span> <span>{</span><span>'title'</span><span>:</span> <span>{</span><span>'required'</span><span>:</span> <span>True</span><span>},</span> <span># Field-level validation </span> <span>'published_date'</span><span>:</span> <span>{</span><span>'format'</span><span>:</span> <span>'%Y-%m-%d'</span><span>}</span> <span># Custom date format </span> <span>}</span><span># Example with 'extra_kwargs': </span><span>class</span> <span>BookSerializer</span><span>(</span><span>serializers</span><span>.</span><span>ModelSerializer</span><span>):</span> <span>class</span> <span>Meta</span><span>:</span> <span>model</span> <span>=</span> <span>Book</span> <span>fields</span> <span>=</span> <span>'__all__'</span> <span>extra_kwargs</span> <span>=</span> <span>{</span> <span>'title'</span><span>:</span> <span>{</span><span>'required'</span><span>:</span> <span>True</span><span>},</span> <span># Field-level validation </span> <span>'published_date'</span><span>:</span> <span>{</span><span>'format'</span><span>:</span> <span>'%Y-%m-%d'</span><span>}</span> <span># Custom date format </span> <span>}</span># Example with 'extra_kwargs': class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = '__all__' extra_kwargs = { 'title': {'required': True}, # Field-level validation 'published_date': {'format': '%Y-%m-%d'} # Custom date format }
Enter fullscreen mode Exit fullscreen mode
With the ModelSerializer, you can efficiently serialize and deserialize complex Django models to JSON format and easily interact with your API views. It saves you from writing repetitive serialization and deserialization code, making the development of Django REST APIs faster and more convenient.
暂无评论内容