20201018子序列化查询

子序列化查询

为什么要用子序列化查询,因为这样非常方便连表查询。

缺点不可以增子序列化的外键的字段

准备配置

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.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值