DRF序列化:ModelSerializer类的使用

1、model

from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()


class Article(models.Model):
    title = models.CharField(max_length=90, db_index=True)
    body = models.TextField(blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='articles')
    status = models.CharField(max_length=1, default='s', null=True, blank=True)
    create_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['-create_date']
        verbose_name = "Article"
        verbose_name_plural = "Articles"

2、基本序列化器

序列化所有字段

from rest_framework import serializers
from models import Article

class ArticleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Article
        fields = '__all__'
        read_only_fields = ('id','create_date')
  • model:指定模型类
  • read_only_fields:只读,不可被修改

3、 指定字段

from rest_framework import serializers
from models import Article

class ArticleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Article
        fields = ['title', 'body']
        read_only_fields = ('id','create_date')
  • fields:指定序列化的字段,其他字段不会显示。

4、添加模型中没有的字段:SerializerMethodField

SerializerMethodField可用于将任何类型的数据添加到对象的序列化表示中

添加点赞数字段:num_of_likes

from rest_framework import serializers
from models import Article, Author

class ArticleSerializer(serializers.ModelSerializer):
    num_of_likes = serializers.SerializerMethodField()

    class Meta:
        model = Article
        fields = ['title', 'body', 'num_of_likes']

    def get_num_of_likes(self, obj):
        num_of_likes = None
        if obj.author:
            num_of_likes = Author.object.filter(name=obj.author).first().num_of_likes
        return num_of_likes
  1. 添加字段:num_of_likes
  2. 将新增的字段加入到fields中。
  3. 编写函数返回num_of _likes的值,规定以get_开头,加上字段名称
    • 参数固定,obj代表被序列化的Article 模型的实例。

5、动态的删除字段(不必写死)

原理:利用序列化器初始化操作时更改序列化器

在HHH条件下删除body

from rest_framework import serializers
from models import Article, Author

class ArticleSerializer(serializers.ModelSerializer):
    num_of_likes = serializers.SerializerMethodField()

    class Meta:
        model = Article
        fields = ['title', 'body', 'num_of_likes']

    def __init__(self, *args, **kwargs):
        super.().__init__(*args, **kwargs)
        condition = self.context.get('condition')
        if condition == "HHHH":
            self.fields.pop('body')


    def get_num_of_likes(self, obj):
        num_of_likes = None
        if obj.author:
            num_of_likes = Author.object.filter(name=obj.author).first().num_of_likes
        return num_of_likes
  • super().__init__(*args, **kwargs):调用父类的初始化方法,确保父类的初始化逻辑得以执行。分为三部分

    • super():返回父类的一个临时对象,可以用来调用其方法。
    • __init__:表示要调用的方法是父类的初始化方法。
    • (*args, **kwargs):传递当前类的参数给父类的初始化方法,确保正确地处理继承链中的参数。
  • 重点self.context:self.context 是序列化器的上下文,可以用于传递额外的参数。(它是在调用序列化器时传递进来的,具体看序列化器的使用部分。)

  • 删除:self.fields.pop

6、动态的添加字段(不必写死)

原理:利用序列化器初始化操作时更改序列化器

在HHH条件下增加count

from rest_framework import serializers
from models import Article, Author

class ArticleSerializer(serializers.ModelSerializer):
    num_of_likes = serializers.SerializerMethodField()

    class Meta:
        model = Article
        fields = ['title', 'body', 'num_of_likes']

    def __init__(self, *args, **kwargs):
        super.().__init__(*args, **kwargs)
        condition = self.context.get('condition')
        if condition == "HHHH":
            self.fields.update({'count': serializers.SerializerMethodField()})


    def get_num_of_likes(self, obj):
        num_of_likes = None
        if obj.author:
            num_of_likes = Author.object.filter(name=obj.author).first().num_of_likes
        return num_of_likes

    def get_count(self, obj):
        count = None
        if obj.author:
            ……
        return count
  • 注意:不需要定义一个该字段的类属性,不需要在元属性(Meta)的fields中增加该字段。

发表评论

评论列表,共 0 条评论

    暂无评论