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
- 添加字段:num_of_likes
- 将新增的字段加入到fields中。
- 编写函数返回num_of _likes的值,规定以
get_
开头,加上字段名称- 参数固定,obj代表被序列化的
Article
模型的实例。
- 参数固定,obj代表被序列化的
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 条评论
暂无评论