ModelViewSet和ModelSerializer的使用
ModelSerializer
########demp3app/serializers.py#########
from rest_framework import serializers
from demoapp import models as dm1model
class UserSer(serializers.ModelSerializer):
class Meta:
#指定模型类
model = dm1model.User
#指定序列化字段
fields = "__all__" #所有字段
#fields = ("username","home") #其中某几个字段
#序列化深度,是否序列化外键
depth = 1
#只序列化字段
read_only_fields = ('id', 'bread', 'bcomment')
#额外参数,修改字段设置
#extra_kwargs = {
# 'age': {'min_value': 0, 'required': True},
# 'hight': {'min_value': 0, 'required': True},
#}
Urls.py
#########demp3app/urls.py##############
from django.urls import path,include,re_path
from demo3app.views import *
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("user",UserModelView)
urlpatterns = [
path("",include(router.urls)),
# path("index1/",Index1.as_view()),
]
Views.py
#########demp3app/views.py##############
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from demoapp import models as dm1model
from demo3app import serializers as dm3ser
# Create your views here.
class UserModelView(ModelViewSet):
queryset = dm1model.User.objects.all()
serializer_class = dm3ser.UserSer
ModelViewSet的过滤,排序和分页
过滤
- 下载所需三方包
pip install django-filter
- 配置文件
########settings.py#########
INSTALLED_APPS = [
...
'django_filters', # 需要注册应用,
]
#全局配置过滤器
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
- 使用
#########demp3app/views.py##############
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from demoapp import models as dm1model
from demo3app import serializers as dm3ser
from django_filters.rest_framework import DjangoFilterBackend
# Create your views here.
#使用全局过滤器
class UserModelView(ModelViewSet):
queryset = dm1model.User.objects.all()
serializer_class = dm3ser.UserSer
filter_fields = ("username","age","home")
#局部使用过滤器
class UserModelView(ModelViewSet):
queryset = dm1model.User.objects.all()
serializer_class = dm3ser.UserSer
filter_backends = [DjangoFilterBackend] #申明配置过滤器
filter_fields = ("username","age","home")
- 请求时在get请求里最后加上对应的条件
http://127.0.0.1:8000/dm3/user/?home=河南&username=peter2
排序
- 配置
########settings.py#########
#全局配置过滤器
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.OrderingFilter',)
}
- 使用
#########demp3app/views.py##############
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from demoapp import models as dm1model
from demo3app import serializers as dm3ser
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
# Create your views here.
#全局配置使用
class UserModelView(ModelViewSet):
queryset = dm1model.User.objects.all()
serializer_class = dm3ser.UserSer
ordering_fields = ("age","hight")
#局部配置使用
class UserModelView(ModelViewSet):
queryset = dm1model.User.objects.all()
serializer_class = dm3ser.UserSer
filter_backends = [OrderingFilter] #申明配置排序过滤器
ordering_fields = ("age","hight")
- 请求时在get请求里最后加上对应的条件
http://127.0.0.1:8000/dm3/user/?ordering=hight
过滤和排序联合使用
- 设置
########settings.py#########
REST_FRAMEWORK = {
#过滤器
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.OrderingFilter')
}
- 使用
#########demp3app/views.py##############
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from demoapp import models as dm1model
from demo3app import serializers as dm3ser
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
# Create your views here.
class UserModelView(ModelViewSet):
queryset = dm1model.User.objects.all()
serializer_class = dm3ser.UserSer
#filter_backends = [OrderingFilter,DjangoFilterBackend] #如过未设置全局配置,需要在这局部配置
ordering_fields = ("age","hight")
filter_fields = ("username","age","home")
- 请求时在get请求里最后加上对应的条件
http://127.0.0.1:8000/dm3/user/?ordering=hight&home="河南"
分页
全局配置
########settings.py#########
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 3 # 每页数目
}
- 请求时在get请求里最后加上对应的条件
http://127.0.0.1:8000/dm3/user/?page=3
局部配置和使用
#########demp3app/views.py##############
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from demoapp import models as dm1model
from demo3app import serializers as dm3ser
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.pagination import PageNumberPagination
# Create your views here.
class MyPage(PageNumberPagination):
page_size_query_param = "max_page"
page_query_param = "page"
class UserModelView(ModelViewSet):
queryset = dm1model.User.objects.all()
serializer_class = dm3ser.UserSer
pagination_class = MyPage
- 请求时在get请求里最后加上对应的条件
http://127.0.0.1:8000/dm3/user/?page=3&max_page=3
ModelViewSet分开指定序列化器
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from demoapp import models as dm1model
from demo3app import serializers as dm3ser
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.pagination import PageNumberPagination
# Create your views here.
class MyPage(PageNumberPagination):
page_size_query_param = "max_page"
page_query_param = "page"
class UserModelView(ModelViewSet):
queryset = dm1model.User.objects.all()
serializer_class = dm3ser.UserSer
pagination_class = MyPage
# 根据不同的请求, 获得不同的序列化器
def get_serializer_class(self):
if self.action == 'list':
return UserSer
else:
return UserSimpleSer