子序列化查询
为什么要用子序列化查询,因为这样非常方便连表查询。
缺点不可以增子序列化的外键的字段
准备配置
django3.1版本,修改settings配置,注册rest_framework
drf_project20201018/settings.py
import os
数据表准备
1、数据表模型类创建
api/models.py
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
updated_time = models.DateTimeField(auto_now_add=True)
class Meta:
abstract = True
class Author(BaseModel):
name = models.CharField(max_length=64)
class AuthorDetail(BaseModel):
phone = models.CharField(max_length=11)
author = models.OneToOneField(to=Author,
related_name='detail',
db_constraint = False,
on_delete = models.SET_NULL,
null = True)
2、数数据表注册
api/admin.py
from . import models
admin.site.register(models.Author)
admin.site.register(models.AuthorDetail)
3、数据迁移
terminal终端输入命令:
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
创建超级用户的用户名,邮箱直接跳过,然后是密码,密码确认这几步。
4、添加数据
用浏览器来访问后台,http://127.0.0.1:8000/admin,用超级用户的信息登录进去,添加两个数据,
author 1、张天佑2、张天爱,
phone1、123,2、234
创建视图函数
定义get的单查与群查接口函数
from rest_framework.views import APIView
from . import models
from . import serializers
from rest_framework.response import Response
class AuthorAPIView(APIView):
def get(self,request,*args,**kwargs):
pk = kwargs.get('pk')
if pk:
obj = models.Author.objects.get(pk=pk)
serializer = serializers.AuthorModelSerializer(obj)
return Response(serializer.data)
else:
queryset = models.Author.objects.all()
serializer = serializers.AuthorModelSerializer(queryset,many = True)
return Response(serializer.data)
序列化类创建
在api文件目录下创建serializers.py文件
api/serializers.py
from rest_framework import serializers
from . import models
class AuthorModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Author
fields = ['name']
路由配置
总路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
]
子路由
在api文件目录下,创建urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^authors/$',views.AuthorAPIView.as_view()),
url(r'^authors/(?P<pk>\d+)/$',views.AuthorAPIView.as_view()),
]
ok,这样就可以查看到前台的接口里面的authors表的name的数据了。
这个时候如果我还想要这个author的详情的信息呢?这个就要进行detail字段的序列化展示detail字段关联的那个AuthorDetail表的phone信息,这个就叫做子序列化。怎么子序列化?
更新序列化类
update serializers/serializer.py代码
1、添加序列化类的字段,detail,detail是relate_name的参数
2、子序列化类在该序列化类的上方,配置models模型类的表,给fields字段
3、在序列化类中给detail字段与子序列化类的实例绑定
from rest_framework import serializers
from . import models
class AuthorDetailModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.AuthorDetail
fields = ['phone']
class AuthorModelSerializer(serializers.ModelSerializer):
detail = AuthorDetailModelSerializer()
class Meta:
model = models.Author
fields = ['name', 'detail']
试一下,这个用浏览器中127.0.0.1:8000/api/authors/来测试一下,也可以用postman来测试一下。
今天就不写那个另外的一个就是多对多表的查询了,那个是要写另外一个是many=true的设置,这个先留着,我写这个就需要70分的预期,不要求完美的写出来,不然那个就是写出来就是70分了,这样70分的预期写出来的,最后会拿到90分。Thank you for your watching.