DRF笔记-自定义序列化字段
表结构:(一对多)
-
班级ClassRoom:id、classname。
-
学生Student:id、name、gender、room(外键)。
-
表数据如下所示:
-
1.models.py:
from django.db import models
class ClassRoom(models.Model):
"""班级模型类"""
classname = models.CharField(max_length=10, verbose_name='班级名称')
class Meta:
db_table = 'classroom'
verbose_name = '班级信息表'
verbose_name_plural = verbose_name
def __str__(self):
return self.classname
class Student(models.Model):
"""学生模型类"""
name = models.CharField(max_length=10, verbose_name='学生姓名')
GENDER_CHOICES = (
(0, '女'),
(1, '男'),
(2, '未知')
)
gender = models.SmallIntegerField(choices=GENDER_CHOICES, verbose_name='学生性别')
room = models.ForeignKey(to='ClassRoom', on_delete=models.CASCADE)
class Meta:
db_table = 'student'
verbose_name = '学生信息表'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
2.serializers.py
from .models import ClassRoom, Student
from rest_framework import serializers
class ClassRoomSerializer(serializers.ModelSerializer):
class Meta:
model = ClassRoom
fields = '__all__'
class StudentSerializer(serializers.ModelSerializer):
gender_list = serializers.CharField(source='get_gender_display', read_only=True) # 自定义显示字段(男、女)
roomc = serializers.CharField(source='room.classname', read_only=True)
class Meta:
model = Student
fields = ('name', 'gender', 'room', 'roomc', 'gender_list') # 加入自定义的字段:gender_list,roomc
# fields = '__all__'
extra_kwargs = {
'gender': {'write_only': True}, # get时不显示,post时需要填写该字段
'room': {'write_only': True} # get时不显示,post时需要填写该字段
}
3.app:urls.py
from django.urls import path
from .views import StudentView
urlpatterns = [
path('students/', StudentView.as_view()),
]
4.project:urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('app04.urls')),
]
测试:
get请求:http://127.0.0.1:8000/api/students/,显示自定义字段
post请求:http://127.0.0.1:8000/api/students/ ,添加一个学生
结束…