【Django REST framework】通过generics.ListAPIView实现序列化和分页(4)


发布时间:2020-02-17 14:44    作者: Uncle Hui   已过去:4 月,3 周   阅读总量:289 已被赞:1


为了展示generics.ListAPIView对于图片字段的处理优势,我给博客文章模型添加了一个展示图片的字段。

1.settings.py 里配置media路径

MEDIA_URL = '/media/'#url映射
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')     #设置静态文件路径为主目录下的media文件夹

2.主url.py配置

#media配置
from django.conf import settings
from django.conf.urls.static import static


#引入文档
from rest_framework.documentation import include_docs_urls
urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
    re_path(r'^docs/', include_docs_urls(title='博客文档')),
    re_path(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
#media配置
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 

 3.环境里安装图像处理插件。

pip install Pillow
 

 4.模型修改

4.1 在my_drf 项目根目录下新建一个media文件夹,放入一张图片

4.2 模型修改

class Blog_Posts(models.Model):
    title = models.CharField(max_length=100, verbose_name='文章标题')
    context = models.TextField(verbose_name='文章内容')
    author = models.ForeignKey(User, verbose_name='文章作者', on_delete=models.DO_NOTHING)
    tag = models.ForeignKey(Tag, verbose_name='博客分类', on_delete=models.DO_NOTHING)
    put_in_time = models.DateTimeField(verbose_name='发布时间', default=timezone.now)
    up_to_date = models.DateTimeField(verbose_name='更新时间', auto_now=True)
    img = models.ImageField(default='123.png')
    def __str__(self):
        return self.title
    class Meta:  # 后台管理显示汉字,这里必须用Meta
        ordering = ['-up_to_date']  # 按修改时间倒序排列
        verbose_name = '博文管理'
        verbose_name_plural = verbose_name

5.迁移数据库

 generics.ListAPIView实现序列化和分页开始:

修改blog/view.py:

from rest_framework import generics
from .models import Blog_Posts
from .serializer import Blog_PostsSerializer
from rest_framework.pagination import PageNumberPagination
#配置分页
class Blog_PostsPagination(PageNumberPagination):
    page_size = 5 #每页多少条数据
    page_size_query_param = 'page_size' #像后台请求多少条,&page_siz=20
    page_query_param = 'p' #url上分页标识 eg: ?p=2
    max_page_size = 100 #最大单页数量

 

#序列化视图
class Blog_PostslistView(generics.ListAPIView):
    '''
    generics.ListAPIView实现序列化
    '''
    queryset = Blog_Posts.objects.all()
    serializer_class = Blog_PostsSerializer
    pagination_class = Blog_PostsPagination

 注意:这些参数名字都是固定的。

queryset = Blog_Posts.objects.all()    #要序列化的数据
          serializer_class = Blog_PostsSerializer  # 要序列化的Serializer表
           pagination_class = Blog_PostsPagination #分页配置引入

我们可以看见,数据已经很人性的序列化好了,还出现了分页功能,图片有完整的路径,有总条数等

完成!

点赞

1




登陆后方可评论