日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[django]梳理drf知识点

發(fā)布時(shí)間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [django]梳理drf知识点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

要實(shí)現(xiàn)的功能

idc_list/get 列出所有post 創(chuàng)建一個(gè)idcidc_detail/1/get 獲取一個(gè)idcput 修改一個(gè)idcdelete 刪除一個(gè)idc

一般url是這樣處理的

url("^idcs/$", idc_list),url("^idcs/(?P<pk>[0-9]+)/$", idc_detail)

從后端取數(shù)據(jù)到前端有哪些流程? 什么叫序列化? 什么叫反序列化?

序列化&反序列化

對(duì)象 -> 字符串 是序列化 json.dump()
字符串->對(duì)象 是反序列化 json.parse()


3件大事

1.取數(shù)據(jù)

2.序列化

3.方法綁定 asview方法搞定

GenericAPIView2個(gè)get沖突,必須寫(xiě)2個(gè)view,而viewset重寫(xiě)了as_view方法,解決了這個(gè)url問(wèn)題

- GenericAPIView不能把所有的都混在一起,必須分2個(gè)view寫(xiě)class IdcList_v4(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):queryset = Idc.objects.all()serializer_class = IdcSerializerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class IdcDetail_v4(generics.GenericAPIView, mixins.RetrieveModelMixin, mixins.UpdateModelMixin,mixins.DestroyModelMixin):queryset = Idc.objects.all()serializer_class = IdcSerializerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)

1個(gè)資源為什么要2個(gè)url? viewset可以解決idc_list和idc_detail 1個(gè)資源兩個(gè)url問(wèn)題

- viewset可以這樣寫(xiě)class IdcListViewset_v6(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin,mixins.RetrieveModelMixin, mixins.UpdateModelMixin,mixins.DestroyModelMixin):queryset = Idc.objects.all()serializer_class = IdcSerializer

巧妙的寫(xiě)2個(gè)綁定關(guān)系,都綁定到一個(gè)試圖上

path('idcs/', views.IdcListViewset.as_view({'get': 'list', 'post': 'create'}), name='idc_list'),path('idcs/<int:pk>/', views.IdcDetailViewset.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}),

最終被router徹底解決

rom rest_framework.routers import DefaultRouter from idcs.views import IdcViewsetroute = DefaultRouter() route.register('idcs', IdcViewset)urlpatterns = [path('', include(route.urls)), ]

mixin做什么事情?

1,取數(shù)據(jù) 2.序列化 --這兩項(xiàng)mixins.RetrieveModelMixin做的實(shí)行3.綁定方法: as_view做點(diǎn)事情 取數(shù)據(jù) 序列化 render 方法綁定 mixin mixin APIView+Response干了 as_view干了存數(shù)據(jù): IdcSerilizer(data=request.data)取數(shù)據(jù): Response(IdcSerilizer(idc.data))

3種as_view

  • as_view的功能

  • as_view的內(nèi)置3種

1. as_view() base 2. as_view() restframework 重寫(xiě)了as_view方法 3. as_view() Viewset 重寫(xiě)了as_view方法 - 用的的是 1. as_view() base class IdcList_v3(APIView):def get(self, request):return Response(IdcSerializer(Idc.objects.all().data, many=True))def post(self, request):serializer = IdcSerializer(data=request.data)if serializer.is_valid():serializer.save()return HttpResponse("創(chuàng)建成功")return HttpResponse("創(chuàng)建失敗") - 用的是 2. as_view() restframework class IdcList_v5(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):queryset = Idc.objects.all()serializer_class = IdcSerializerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs) - 用的是 3. as_view() Viewset(要求綁定關(guān)系寫(xiě)到url里)class IdcListViewset(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin):queryset = Idc.objects.all()serializer_class = IdcSerializer path('idcs/', views.IdcListViewset.as_view({'get': 'list', 'post': 'create'}), name='idc_list'),path('idcs/<int:pk>/', views.IdcDetailViewset.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}),name='idc_detail'),

提交數(shù)據(jù),數(shù)據(jù)驗(yàn)證流程

提交一次數(shù)據(jù)流程

class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"def to_internal_value(self, data):print('to_internal_value(data): ', data)return super(ManufacturerSerializer, self).to_internal_value(data)def validate_vender_name(self, data):print('validate_vender_name(data): ', data)return datadef validate(self, attrs):print("validate驗(yàn)證(attrs): ", attrs)return attrsdef create(self, validated_data):print('create(validated_data): ', validated_data)return Manufacturer.objects.create(**validated_data) to_internal_value(data) : <QueryDict: {'csrfmiddlewaretoken': ['bp0QXpil9GwXUDhKYO0ut03dr2C6YGVT12WWOGIV49z7QMEeZHRE5Qsz4DBE5tTt'], 'vender_name': ['dell'], 'tel': ['13111111111'], 'mail': ['xxx@foxmail.com'], 'remark': ['test']}> validate_vender_name(data) : dell validate驗(yàn)證(attrs) : OrderedDict([('vender_name', 'dell'), ('tel', '13111111111'), ('mail', 'xxx@foxmail.com'), ('remark', 'test')]) create(validated_data) : {'vender_name': 'dell', 'tel': '13111111111', 'mail': 'xxx@foxmail.com', 'remark': 'test'}

子表展示主表的字段(to_representation): 希望獲取某個(gè)機(jī)柜時(shí)候,展示idc的id&name

注意: 從db取出數(shù)據(jù)到前端展示, 不經(jīng)過(guò)validate和validate_data, 所以只能在to_representation處做.

- IDC APP class Idc(models.Model):name = models.CharField(max_length=20)address = models.CharField(max_length=20)phone = models.CharField(max_length=20)letter = models.CharField(max_length=20)def __str__(self):return self.name- 機(jī)柜APPfrom idcs.models import Idcclass Cabinet(models.Model):"機(jī)柜模型"idc = models.ForeignKey(Idc, on_delete=models.CASCADE)name = models.CharField('機(jī)柜名稱(chēng)', max_length=40)def __str__(self):return self.name

默認(rèn)是這樣的, 看不出idc的名字

- 機(jī)柜序列化類(lèi)to_representation,拋給前端最后一步來(lái)動(dòng)刀class CabinetSerializer(serializers.Serializer):"機(jī)柜序列化類(lèi)"idc = serializers.PrimaryKeyRelatedField(many=False, queryset=Idc.objects.all())name = serializers.CharField(max_length=20)def create(self, validated_data):return Cabinet.objects.create(**validated_data)# instance是一個(gè)機(jī)柜的objdef to_representation(self, instance):print(instance)print(type(instance)) # <class 'cabinet.models.Cabinet'>print(instance.idc)print(type(instance.idc)) # <class 'idcs.models.Idc'>res = super(CabinetSerializer, self).to_representation(instance)print(res) # OrderedDict([('idc', 1), ('name', '1-2')])res['idc'] = {'name': instance.idc.name,'phone': instance.idc.phone}return res

最接近前端的to_representation/to_internal_value處理后的OrderedDict可以k['v']形式取值

也可以通過(guò)點(diǎn)的方式取

OrderedDict([('idc', 1), ('name', '1-2')])res = super(CabinetSerializer, self).to_representation(instance)print(res) # OrderedDict([('idc', 1), ('name', '1-2')])res['idc'] = {'name': instance.idc.name,'phone': instance.idc.phone}

制造商名稱(chēng)大寫(xiě): 入庫(kù)時(shí)4個(gè)節(jié)點(diǎn)可以修改

validate時(shí)修改方便點(diǎn).

  • to_internal_value時(shí)修改
class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"def to_internal_value(self, data):print('data: ', data)res = super(ManufacturerSerializer, self).to_internal_value(data)print('res: ', res)res['vendor_name'] = res['vendor_name'].upper()return resdata: <QueryDict: {'csrfmiddlewaretoken': ['B27kAKtSmrRDmIUco8umj5nFbsdcnOOWVdlBRJ7DgRfJjnmSh7YINSk5nXNbYmoD'], 'vendor_name': ['cs7'], 'tel': ['13333333333'], 'mail': ['ihorse@foxmail.com'], 'remark': ['cs7']}> res: OrderedDict([('vendor_name', 'cs7'), ('tel', '13333333333'), ('mail', 'ihorse@foxmail.com'), ('remark', 'cs7')])
  • validate_vendor_name時(shí)修改
class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"def validate_vendor_name(self, value):print('value: ',value)return value.upper()cs6
  • validate時(shí)修改
class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"def validate(self, attrs):print('validate(attrs): ', attrs)attrs['vendor_name'] = attrs['vendor_name'].upper()return attrsvalidate(attrs): OrderedDict([('vendor_name', 'cs4'), ('tel', '13444444444'), ('mail', 'ihorse@foxmail.com'), ('remark', 'cs4')])
  • create時(shí)候修改
class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"def create(self, validated_data):print('create(validated_data): ',validated_data)validated_data['vender_name'] = validated_data['vender_name'].upper()return Manufacturer.objects.create(**validated_data)create(validated_data): {'vender_name': 'cs8', 'tel': '13444444444', 'mail': 'ihorse@foxmail.com', 'remark': None}

本來(lái)想在創(chuàng)建型號(hào)時(shí)候指定制造商, 如果制造商不存在,則創(chuàng)建.如果存在則關(guān)聯(lián)

{"model_name": "mi8","vender": "xiaomi" } class ProductModelSerializer(serializers.ModelSerializer):class Meta:model = ProductModelfields = "__all__"def to_internal_value(self, data):print(data)res = super(ProductModelSerializer, self).to_representation(data)print(2)try:manufacturer_obj = Manufacturer.objects.get(vender_name__exact=data['vender'])except Manufacturer.DoesNotExist:manufacturer_obj = Manufacturer.objects.create(vender_name=data['vender'])res['vender'] = manufacturer_objreturn res# def validate_vender(self, value): #根本都走不到這里.在to_internal_value時(shí)字段serializer時(shí)候就報(bào)錯(cuò)了.# "制造商驗(yàn)證"# print('value: ', value, type(value))# try:# return Manufacturer.objects.get(vender_name__exact=value)# except Manufacturer.DoesNotExist:# print(type(value))# return Manufacturer.objects.create(vender_name=value)# def validate(self, attrs):# "主表驗(yàn)證子表唯一性"# manufacturer_obj = attrs['vender']# try:# manufacturer_obj.productmodel_set(model_name__exact=attrs['model_name'])# except ProductModel.DoesNotExist:# return attrs<QueryDict: {'csrfmiddlewaretoken': ['afVAElHU9XdiA4J41r8Kiycs2uLqRwy9kyTK1tpyIuaNw5P6bg3yFf03fSmS3vwJ'], 'model_name': ['R710'], 'vender': ['1']}>
  • 下面這種寫(xiě)法也報(bào)錯(cuò)

class ProductModelSerializer(serializers.ModelSerializer):class Meta:model = ProductModelfields = "__all__"def validate_manufacturer(self, value):"制造商唯一性驗(yàn)證"try:return Manufacturer.objects.get(vendor_name__exact=value)except Manufacturer.DoesNotExist:return self.create_manufacturer(value)def create_manufacturer(self, vendor_name):"創(chuàng)建制造商"return Manufacturer.objects.create(vendor_name=vendor_name)def validate(self, attrs):"制造商下型號(hào)唯一性驗(yàn)證"manufacturer_obj = attrs["manufacturer"]try:# 如果存在則獲取索引# 如果不存在則創(chuàng)建并獲取索引attrs["model_name"] = manufacturer_obj.productmodel_set.get(model_name__exact=attrs["model_name"])except ProductModel.DoesNotExist:attrs["model_name"] = self.create_product_model(manufacturer_obj, attrs["model_name"])return attrs

解決這個(gè)問(wèn)題

1.序列化時(shí)外鍵是字符串
2.和primarykey形成對(duì)比

class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"class ProductModelSerializer(serializers.Serializer):# class Meta:# model = ProductModel# fields = "__all__"model_name = serializers.CharField(required=True)vender = serializers.CharField(required=True)def validate_vender(self, value):print(value)"制造商唯一性驗(yàn)證"try:return Manufacturer.objects.get(vender_name__exact=value)except Manufacturer.DoesNotExist:return self.create_manufacturer(value)def create_manufacturer(self, vender_name):"創(chuàng)建制造商"return Manufacturer.objects.create(vender_name=vender_name)def validate(self, attrs):"制造商下型號(hào)唯一性驗(yàn)證"print(attrs)manufacturer_obj = attrs["vender"]try:# 如果存在則獲取索引# 如果不存在則創(chuàng)建并獲取索引attrs["model_name"] = manufacturer_obj.productmodel_set.get(model_name__exact=attrs["model_name"])except ProductModel.DoesNotExist:# attrs["model_name"] = self.create_product_model(manufacturer_obj, attrs["model_name"])passreturn attrsdef create(self, validated_data):print(validated_data) # {'model_name': 'mi10', 'vender': <Manufacturer: xiaomi>}"創(chuàng)建型號(hào)"return ProductModel.objects.create(**validated_data)

子表顯示外鍵

方法1: 繼承ModelSerializer

class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"def validate_vender_name(self, data):return data.upper()class ProductModelSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"

方法2: PrimaryKeyRelatedField

class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"def validate_vender_name(self, data):return data.upper()class ProductModelSerializer(serializers.Serializer): # 必須實(shí)現(xiàn)create: `create()` must be implemented.model_name = serializers.CharField(max_length=20)vender = serializers.PrimaryKeyRelatedField(many=False, queryset=Manufacturer.objects.all())def create(self, validated_data):ProductModel.objects.create(**validated_data)

方法3:

class ManufacturerSerializer(serializers.ModelSerializer):class Meta:model = Manufacturerfields = "__all__"def validate_vender_name(self, data):return data.upper()

1.判斷制造商是否存在: to_internal_value節(jié)點(diǎn)實(shí)現(xiàn)

class ProductModelSerializer(serializers.Serializer): # 必須實(shí)現(xiàn)create: `create()` must be implemented.model_name = serializers.CharField(max_length=20)vender = serializers.CharField(max_length=20)def to_internal_value(self, data):print(data)res = super(ProductModelSerializer, self).to_internal_value(data)print(res) # OrderedDict([('model_name', 'mi10'), ('vender', 'xiaomi')])try:res['vender'] = Manufacturer.objects.get(vender_name__exact=res['vender'])except Manufacturer.DoesNotExist:res['vender'] = Manufacturer.objects.create(vender_name=res['vender'])print(res) # OrderedDict([('model_name', 'mi10'), ('vender', <Manufacturer: xiaomi>)])return resdef validate(self, attrs):print(attrs) # OrderedDict([('model_name', 'mi10'), ('vender', <Manufacturer: xiaomi>)])return attrsdef create(self, validated_data):return ProductModel.objects.create(**validated_data)

2.判斷制造商是否存在: validate_vender節(jié)點(diǎn)實(shí)現(xiàn)

class ProductModelSerializer(serializers.Serializer): # 必須實(shí)現(xiàn)create: `create()` must be implemented.model_name = serializers.CharField(max_length=20)vender = serializers.CharField(max_length=20)def validate_vender(self, value):print(value) # 'xiaomi'try:manufacturer_obj = Manufacturer.objects.get(vender_name__exact=value)except Manufacturer.DoesNotExist:manufacturer_obj = Manufacturer.objects.create(vender_name=value)return manufacturer_obj # 相當(dāng)于把manufacturer_obj賦給了venderdef validate(self, attrs):print(attrs) # OrderedDict([('model_name', 'mi11'), ('vender', <Manufacturer: xiaomi>)])return attrsdef create(self, validated_data):return ProductModel.objects.create(**validated_data)

3.判斷制造商是否存在: validate節(jié)點(diǎn)實(shí)現(xiàn)

class ProductModelSerializer(serializers.Serializer): # 必須實(shí)現(xiàn)create: `create()` must be implemented.model_name = serializers.CharField(max_length=20)vender = serializers.CharField(max_length=20)def validate(self, attrs):print(attrs) # OrderedDict([('model_name', 'p1'), ('vender', 'google')])try:attrs['vender'] = Manufacturer.objects.get(vender_name__exact=attrs['vender'])except Manufacturer.DoesNotExist:attrs['vender'] = Manufacturer.objects.create(vender_name=attrs['vender'])print(attrs) # OrderedDict([('model_name', 'p1'), ('vender', <Manufacturer: google>)])return attrsdef create(self, validated_data):return ProductModel.objects.create(**validated_data)

方法4: 也可以在create時(shí)候?qū)崿F(xiàn)

通過(guò)主表,驗(yàn)證子表字段的唯一性: 驗(yàn)證該型號(hào)已存在

方法1: 在to_internal驗(yàn)證

方法2: 在valida_filed驗(yàn)證

方法3: 在validate時(shí)候驗(yàn)證

class ProductModelSerializer(serializers.Serializer): # 必須實(shí)現(xiàn)create: `create()` must be implemented.model_name = serializers.CharField(max_length=20)vender = serializers.CharField(max_length=20)def validate(self, attrs):"制造商驗(yàn)證"print(attrs) # OrderedDict([('model_name', 'p2'), ('vender', 'google')])try:attrs['vender'] = Manufacturer.objects.get(vender_name__exact=attrs['vender'])except Manufacturer.DoesNotExist:attrs['vender'] = Manufacturer.objects.create(vender_name=attrs['vender'])print(attrs) # OrderedDict([('model_name', 'p2'), ('vender', <Manufacturer: google>)])"制造商下型號(hào)唯一性驗(yàn)證"try:attrs['vender'].productmodel_set.get(model_name__exact=attrs['model_name'])raise serializers.ValidationError("該型號(hào)已存在")except ProductModel.DoesNotExist:passreturn attrsdef create(self, validated_data):print(validated_data) # OrderedDict([('model_name', 'p2'), ('vender', <Manufacturer: google>)])return ProductModel.objects.create(**validated_data)

方法4: 在create時(shí)候驗(yàn)證

class ProductModelSerializer(serializers.Serializer): # 必須實(shí)現(xiàn)create: `create()` must be implemented.model_name = serializers.CharField(max_length=20)vender = serializers.CharField(max_length=20)def validate(self, attrs):"制造商驗(yàn)證"print(attrs) # OrderedDict([('model_name', 'p2'), ('vender', 'google')])try:attrs['vender'] = Manufacturer.objects.get(vender_name__exact=attrs['vender'])except Manufacturer.DoesNotExist:attrs['vender'] = Manufacturer.objects.create(vender_name=attrs['vender'])print(attrs) # OrderedDict([('model_name', 'p2'), ('vender', <Manufacturer: google>)])return attrsdef create(self, validated_data):print(validated_data) # OrderedDict([('model_name', 'p2'), ('vender', <Manufacturer: google>)])"制造商下型號(hào)唯一性驗(yàn)證"try:validated_data['vender'].productmodel_set.get(model_name__exact=validated_data['model_name'])raise serializers.ValidationError("該型號(hào)已存在")except ProductModel.DoesNotExist:return ProductModel.objects.create(**validated_data)

繼承邏輯關(guān)系圖

drf的版本迭代

from django.http import HttpResponse, JsonResponse from django.shortcuts import render# Create your views here. from django.views.generic.base import Viewfrom rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework.reverse import reverse from rest_framework.views import APIView from rest_framework import viewsetsfrom .models import Idc from .serializers import IdcSerializer from rest_framework.renderers import JSONRenderer from rest_framework.parsers import JSONParserfrom rest_framework import mixins, genericsclass IdcView(viewsets.ModelViewSet):queryset = Idc.objects.all()serializer_class = IdcSerializerclass IdcView_v7(viewsets.GenericViewSet,mixins.ListModelMixin,mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin):queryset = Idc.objects.all()serializer_class = IdcSerializerclass IdcView_v6(generics.ListCreateAPIView, generics.RetrieveUpdateDestroyAPIView):queryset = Idc.objects.all()serializer_class = IdcSerializerclass IdcViewDetail_v6(generics.RetrieveUpdateDestroyAPIView):queryset = Idc.objects.all()serializer_class = IdcSerializerclass IdcView_v5(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):queryset = Idc.objects.all()serializer_class = IdcSerializerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class IdcViewDetail_v5(generics.GenericAPIView,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin):queryset = Idc.objects.all()serializer_class = IdcSerializerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)class IdcView_v4(APIView):def get(self, request, *args, **kwargs):return Response(IdcSerializer(Idc.objects.all(), many=True).data)def post(self, request, *args, **kwargs):serializer = IdcSerializer(data=request.data)if serializer.is_valid():serializer.save()return HttpResponse('添加成功')return HttpResponse('驗(yàn)證失敗')class IdcViewDetail_v4(APIView):def get_object(self, pk):try:return Idc.objects.get(pk=pk)except Exception as e:return HttpResponse("無(wú)此記錄")def get(self, request, pk, *args, **kwargs):return Response(IdcSerializer(self.get_object(pk)).data)def put(self, request, pk, *args, **kwargs):serializer = IdcSerializer(self.get_object(pk), data=request.data)if serializer.is_valid():serializer.save()return HttpResponse('添加成功')return HttpResponse('驗(yàn)證失敗')def delete(self, request, pk, *args, **kwargs):self.get_object(pk).delete()return HttpResponse('刪除成功')@api_view(['GET']) def api_root(request, format=None, *args, **kwargs):return Response({'idc-list': reverse('idcs:idc-list', request=request)})@api_view(['GET', 'POST']) def idc_list_v3(request):if request.method == "GET":return Response(IdcSerializer(Idc.objects.all(), many=True).data)elif request.method == "POST":serializer = IdcSerializer(data=request.data)if serializer.is_valid():serializer.save()return HttpResponse('添加成功')return HttpResponse('驗(yàn)證失敗')@api_view(['GET', 'PUT', 'DELETE']) def idc_detail_v3(request, pk):try:idc = Idc.objects.get(pk=pk)except Exception as e:return "記錄不存在"if request.method == "GET":return Response(IdcSerializer(idc).data)if request.method == "PUT":serializer = IdcSerializer(idc, data=request.data)if serializer.is_valid():serializer.save()return HttpResponse('修改成功')return HttpResponse('驗(yàn)證失敗')if request.method == "DELETE":idc.delete()return HttpResponse('刪除成功')class IdcView_v2(View):def get(self, request):return HttpResponse(JSONRenderer().render(IdcSerializer(Idc.objects.all(), many=True).data))def post(self, request):serializer = IdcSerializer(data=request.data)if serializer.is_valid():serializer.save()return HttpResponse('添加成功')return HttpResponse('驗(yàn)證失敗')class IdcViewDetail_v2(View):def get_object(self, pk):try:return Idc.objects.get(pk=pk)except Exception as e:return HttpResponse("無(wú)此記錄")def get(self, request, pk):return HttpResponse(JSONRenderer().render(IdcSerializer(self.get_object(pk))))def put(self, request, pk):idc = self.get_object(pk)serializer = IdcSerializer(idc, data=JSONParser().parse(request))if serializer.is_valid():serializer.save()return HttpResponse('修改成功')return HttpResponse('驗(yàn)證失敗')def idc_list_v1(request):if request.method == "GET":return HttpResponse(JSONRenderer().render(IdcSerializer(Idc.objects.all(), many=True).data))elif request.method == "POST":serializer = IdcSerializer(data=JSONParser().parse(request))if serializer.is_valid():serializer.save()return HttpResponse('添加成功')return HttpResponse('驗(yàn)證失敗')def idc_detail_v1(request, pk):try:idc = Idc.objects.get(pk=pk)except Exception as e:return HttpResponse("沒(méi)有這個(gè)記錄")if request.method == "GET":return HttpResponse(JSONRenderer().render(IdcSerializer(idc).data))elif request.method == "PUT":serializer = IdcSerializer(idc, data=JSONParser().parse(request))if serializer.is_valid():serializer.save()return HttpResponse('更新成功')return HttpResponse('驗(yàn)證失敗')elif request.method == "DELETE":Idc.objects.get(pk=pk).delete()return HttpResponse('刪除成功') # @api_view(['GET', 'PUT']) # def idc_list(request, *args, **kwargs): # if request.method == "GET": # queryset = Idc.objects.all() # serializer = IdcSerializer(queryset, many=True) # return Response(serializer.data) # elif request.method == "PUT": # serializer = IdcSerializer(request.data) # return HttpResponse("")

urls.py

from django.contrib import admin from django.urls import path, include from django.views.generic import TemplateView from rest_framework.routers import DefaultRouter from rest_framework.urlpatterns import format_suffix_patternsfrom idcs import views# idc_list = views.IdcView.as_view({ # 'get': 'list', # 'post': 'create' # }) # # idc_detail = views.IdcView.as_view({ # 'get': 'retrieve', # 'put': 'update', # 'delete': 'destroy' # })route = DefaultRouter() route.register('idcs', views.IdcView)app_name = 'idcs' urlpatterns = [# path('', views.api_root),# path('idcs', idc_list, name='idc-list'),path('', include(route.urls)),# path('idcs/<int:pk>/', idc_detail, name='idc-detail'), ] # urlpatterns = format_suffix_patterns(urlpatterns)

drf版本迭代總結(jié)

理解序列化和反序列化的本質(zhì)
https://www.bilibili.com/video/av39886713?from=search&seid=17895786208711765947

python使用protobuf序列化數(shù)據(jù):
https://blog.csdn.net/menghaocheng/article/details/80176763

序列化: 后端->前端 queryset -> serializer -> JSONRender -> 返回前端反序列化:后端<-前端 queryset <- serializer <- JSONParse <- 前端提交ApiView:Response,不用JSONRender/JSONParser了有界面了API_ROOT設(shè)置 url設(shè)置IdcView_v4(APIView) IdcViewDetail_v4(APIView)IdcView_v5(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin) IdcViewDetail_v5(generics.GenericAPIView,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin):不需要關(guān)心數(shù)據(jù)了, 只需綁定方法IdcView_v6(generics.ListCreateAPIView, generics.RetrieveUpdateDestroyAPIView) IdcViewDetail_v6(generics.RetrieveUpdateDestroyAPIView)不需要關(guān)心數(shù)據(jù),不需要綁定方法,但還是有2個(gè)視圖+2個(gè)urlIdcView_v7(viewsets.GenericViewSet,mixins.ListModelMixin,mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin)不需要關(guān)心數(shù)據(jù),需要綁定url, 有1個(gè)視圖了.IdcView(viewsets.ModelViewSet)簡(jiǎn)化了寫(xiě)法.generics.ListCreateAPIView=generics.GenericAPIView+mixins.ListModelMixin+mixins.CreateModelMixinviewsets.ModelViewSet -> viewsets.GenericViewSet --> generics.GenericAPIView(viewset再此基礎(chǔ)上又封裝了2層)mixins.ListModelMixin

route.register函數(shù)的base_name參數(shù)定制url(默認(rèn)是modelname為準(zhǔn))

譬如我寫(xiě)了2個(gè)viewset,針對(duì)的是相同的model和serializer

class ServerAutoReportViewset(viewsets.ReadOnlyModelViewSet):queryset = Server.objects.all()serializer_class = ServerSerializerclass ServerViewset(viewsets.ReadOnlyModelViewSet):queryset = Server.objects.all()serializer_class = ServerSerializer

默認(rèn)展示的時(shí)候以model名字來(lái)展示

否則2個(gè)viewset只顯示第一個(gè).

route.register('ServerAutoReport', ServerAutoReportViewset, base_name='ServerAutoReport') route.register('Server', ServerViewset, base_name='Server')

drf繼承圖

轉(zhuǎn)載于:https://www.cnblogs.com/iiiiiher/p/9892809.html

總結(jié)

以上是生活随笔為你收集整理的[django]梳理drf知识点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。