DRF
學習目標
- FBV 前后端分離源碼
- 需要判斷請求方式
- 序列化吠撮,反序列化難度大
- CBV django的前后端分離
- 不需要判斷請求方式
- 序列化灾而,反序列化難度大
- DRF djangorestframework
- 解決序列化,反序列化問題
- FBV+DRF
- 需要判斷請求方式
- 序列化蓄愁,反序列化問題解決
- CBV+DRF
- 不需要判斷請求方式
- 序列化娶桦,反序列化問題解決
學習課程
1.FBV
概念:基于函數(shù)的視圖函數(shù)贾节。(function base view)
使用結(jié)構(gòu):
if request.method == 'GET':
pass
if request.method == 'POST':
pass
if request.method == 'DELETE':
pass
if request.method == 'PUT':
pass
if request.method == 'PATCH':
pass
注意:請求方式必須大寫
總結(jié):- 需要判斷請求方式
- 序列化汁汗,反序列化難度大
2.CBV
(1)view
概念:基于類的視圖函數(shù)。(class base view)
使用步驟:
①繼承自系統(tǒng)的類視圖
class HelloCBV(View)
②書寫請求方式對應的函數(shù)栗涂, 函數(shù)名就是請求方式名字的小寫
注意只能小寫
方法中的參數(shù)必須書寫request
③:注冊路由 views.類視圖.as_view()
url(r'^index/',views.類名.as_view(),name='index')
url(r'^hello/',views.HelloCBV.as_view(),name='hello')
注意:as_view默認情況下沒有() 需要手動添加
總結(jié):- 不需要判斷請求方式
- 序列化知牌,反序列化難度大
(2)TemplateView
作用:執(zhí)行類視圖然后跳轉(zhuǎn)到指定模板。
TemplateView
繼承TemplateView
不需要寫get方法 因為TemplateView里重寫了get方法
實現(xiàn)方法1
在as_view中書寫tempate_name屬性
eg:
url(r'^template/', views.HelloTemplateView.as_view(template_name='hello.html'), name='template')
實現(xiàn)方法2
在類視圖中指定 template_name='hello.html'
eg:
url(r'^template/', views.HelloTemplateView.as_view(), name='template')
實現(xiàn)原理:
TemplateView繼承了TemplateResponseMixin, ContextMixin, View
TemplateView類中定義了get方法戴差,該方法調(diào)用了TemplateResponseMixin的render_to_response方法
應用場景:單純的跳轉(zhuǎn)頁面 eg:跳轉(zhuǎn)到登陸頁面
(3)ListView
作用:執(zhí)行類視圖然后跳轉(zhuǎn)到指定模板并且傳遞數(shù)據(jù)
ListView
屬性
template_name
model=模型
queryset=模型.object.all()
必須要寫model或者queryset寫一個
渲染在模板上
模型_list
object_list
實現(xiàn)原理:
負責跳轉(zhuǎn)頁面
ListView繼承了MultipleObjectTemplateResponseMixin送爸,
MultipleObjectTemplateResponseMixin繼承了TemplateResponseMixin,
在TemplateResponseMixin中有render_to_response方法
負責傳遞參數(shù)
ListView繼承了BaseListView暖释,
BaseListView繼承了MultipleObjectMixin袭厂,
MultipleObjectMixin中有model和queryset的屬性和get_queryset方法
應用場景:查詢 eg:list 分頁
(4)DetailView
作用:執(zhí)行類視圖跳轉(zhuǎn)到指定模板,傳遞一個數(shù)據(jù)
DetailView
渲染在模板上
template_name
數(shù)據(jù)
model
model=Animal
queryset
queryset = Animal.objects.all()
單一實例
pk
url(r'^single/(?P<pk>\d+)/', views.HeDetailView.as_view(), name='single')
實現(xiàn)原理:
負責跳轉(zhuǎn)頁面
DetailView繼承了SingleObjectTemplateResponseMixin球匕,
SingleObjectTemplateResponseMixin繼承了TemplateResponseMixin纹磺,
TemplateResponseMixin有一個render_to_response方法
負責傳遞參數(shù)
DetailView繼承了BaseDetailView,
BaseDetailView繼承了SingleObjectMixin亮曹,
SingleObjectMixin中有model橄杨,queryset,get_queryset方法
應用場景:修改 點擊修改的時候 然后傳遞id參數(shù) 獲取到對象 在表單中遍歷
總結(jié):
? View適用于前后端分離照卦,方法返回的是json數(shù)據(jù) eg:changexxx
? TemplateView式矫,ListView, DetailView適用全棧開發(fā),
? TemplateView:跳轉(zhuǎn)頁面 eg:toLogin
? ListView:跳轉(zhuǎn)頁面役耕,傳遞數(shù)據(jù) eg:xxxList
DetailView:跳轉(zhuǎn)頁面采转,傳遞單個數(shù)據(jù) eg:loadxxx
3.Drf
實現(xiàn)步驟:
(1)pip install djangorestframework
(2)項目 tutorial
app quickstart
serializers 序列化
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['url', 'username', 'email', 'groups']
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ['url', 'name']
(3) views.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
(4)根路由urls.py
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
urlpatterns = [
url('', include(router.urls)),
url('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
(5)settings
INSTALLED_APPS = [
...
'rest_framework',
]
4.FBV+DRF
實現(xiàn)步驟:
(1)在app中創(chuàng)建serializers文件 序列化器
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField()
b_name = serializers.CharField()
b_price = serializers.FloatField()
def update(self, instance, validated_data):
instance.id = validated_data.get('id',instance.id)
instance.b_name = validated_data.get('b_name',instance.b_name)
instance.b_price = validated_data.get('b_price',instance.b_price)
instance.save()
return instance
def create(self, validated_data):
return Book.objects.create(**validated_data)
(2)創(chuàng)建序列化器對象
bookserializer = BookSerializer(序列化對象)
bookserializer.data
5.CBV+DRF
實現(xiàn)步驟:
(1)class GameSerializer(serializers.ModelSerializer):
class Meta:
model = Game
fields = ['id','g_name']
繼承serializers.ModelSerializer
元信息
model=序列化的模型類
fields=[序列化的字段]
(2)創(chuàng)建序列化器對象
gameserializer = GameSerializer(序列化對象)
gameserializer.data
注意:序列化器默認序列化一個對象 會報錯 解決方案:在序列化器實例化的時候添加參數(shù)many=True
如果報錯safe問題 那么需要在JsonResponse中添加參數(shù)safe=False
亂碼問題:JsonResponse中添加參數(shù)json_dumps_params={'ensure_ascii':False}