Drf03 /呼啦圈网页初步实现、drf筛选、视图(源码实现)

目录

  • Drf03 /呼啦圈网页初步实现、drf筛选、视图(源码实现)

    • 内容回顾与补充
    • 今日详细
      • 1.呼啦圈初步实现
      • 2. 筛选
      • 3.视图

Drf03 /呼啦圈网页初步实现、drf筛选、视图(源码实现)

内容回顾与补充

  1. restful规范

    - URL中一般用名词:
     http://www.luffycity.com/article/ (面向资源编程,网络上东西都视为资源)
    - 根据请求不同做不同操作:GET/POST/PUT/DELTE/PATCH
    - 筛选条件,在URL参数中进行传递:
     http://www.luffycity.com/article/?page=1&category=1
    
    一般传输的数据格式都是JSON
    持续更新...
  2. 潜规则:类的约束
  3. drf的配置
    setting.py
    
    REST_FRAMEWORK = {
     ...
    }
  4. 分页
    • page
    • offset

今日详细

1.呼啦圈初步实现

1.1 表结构设计

  • 不会经常变化的值放在内存:choices形式,避免跨表性能低。
  • 分表:如果表中列太多/大量内容可以选择水平分表
  • 表自关联

from django.db import models

class UserInfo(models.Model):
    """ 用户表 """
    username = models.CharField(verbose_name='用户名',max_length=32)
    password = models.CharField(verbose_name='密码',max_length=64)

class Article(models.Model):
    """ 文章表 """
    category_choices = (
        (1,'咨询'),
        (2,'公司动态'),
        (3,'分享'),
        (4,'答疑'),
        (5,'其他'),
    )
    category = models.IntegerField(verbose_name='分类',choices=category_choices)
    title = models.CharField(verbose_name='标题',max_length=32)
    image = models.CharField(verbose_name='图片路径',max_length=128) # /media/upload/....
    summary = models.CharField(verbose_name='简介',max_length=255)

    comment_count = models.IntegerField(verbose_name='评论数',default=0)
    read_count = models.IntegerField(verbose_name='浏览数',default=0)

    author = models.ForeignKey(verbose_name='作者',to='UserInfo')
    date = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)

class ArticleDetail(models.Model):
    article = models.OneToOneField(verbose_name='文章表',to='Article')
    content = models.TextField(verbose_name='内容')

class Comment(models.Model):
    """ 评论表 """
    article = models.ForeignKey(verbose_name='文章',to='Article')
    content = models.TextField(verbose_name='评论')
    user = models.ForeignKey(verbose_name='评论者',to='UserInfo')
    # parent = models.ForeignKey(verbose_name='回复',to='self', null=True,blank=True)
    # 自关联  --- 评论-->回复-->回复

1.2 系统结构(CMS)

1.3 功能实现

1.3.1 增加文章(可以不写)

一次增加两个表中的数据:

    def post(self,request,*args,**kwargs):
        """ 新增文章(应该在后台管理开发)"""
        ser = ArticleSerializer(data=request.data)
        ser_detail = ArticleDetailSerializer(data=request.data)
        if ser.is_valid() and ser_detail.is_valid():
            # 增加文章
            article_object = ser.save(author_id=1)
            ser_detail.save(article=article_object)
            return Response('添加成功')
        return Response('错误')

1.3.2 文章列表

1.3.3 文章详细

1.3.4 评论列表

  • 查看评论列表
    访问时:http://127.0.0.1:8000/hg/comment/?article=2
  • 添加评论
    http://127.0.0.1:8000/hg/comment/
    
    {
      article:1,
      content:'xxx'
    }
    http://127.0.0.1:8000/hg/comment/?article=1
    
    {
      content:'xxx'
    }

2. 筛选

案例:在文章列表时候,添加筛选功能。

全部:http://127.0.0.1:8000/hg/article/
筛选:http://127.0.0.1:8000/hg/article/?category=2
class ArticleView(APIView):
    """ 文章视图类 """

    def get(self,request,*args,**kwargs):
        """ 获取文章列表 """
        pk = kwargs.get('pk')
        if not pk:
            condition = {}
            category = request.query_params.get('category')
            if category:
                condition['category'] = category
            queryset = models.Article.objects.filter(**condition).order_by('-date')

            pager = PageNumberPagination()
            result = pager.paginate_queryset(queryset,request,self)
            ser = ArticleListSerializer(instance=result,many=True)
            return Response(ser.data)
        article_object = models.Article.objects.filter(id=pk).first()
        ser = PageArticleSerializer(instance=article_object,many=False)
        return Response(ser.data)
drf的组件:内置了筛选的功能
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from . import models

from rest_framework.filters import BaseFilterBackend

class MyFilterBackend(BaseFilterBackend):

    def filter_queryset(self, request, queryset, view):
        val = request.query_params.get('cagetory')
        return queryset.filter(category_id=val)

class IndexView(APIView):

    def get(self,request,*args,**kwargs):
        # http://www.xx.com/cx/index/
        # models.News.objects.all()

        # http://www.xx.com/cx/index/?category=1
        # models.News.objects.filter(category=1)

        # http://www.xx.com/cx/index/?category=1
        # queryset = models.News.objects.all()
        # obj = MyFilterBackend()
        # result = obj.filter_queryset(request,queryset,self)
        # print(result)

        return Response('...')

3.视图

  • APIView,感觉没提供功能。
  • GenericAPIView,桥梁,内部定义:get_queryset/get_serilizer/get_page...
  • ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
class TagSer(serializers.ModelSerializer):
    class Meta:
        model = models.Tag
        fields = "__all__"

class TagView(ListAPIView,CreateAPIView):
    queryset = models.Tag.objects.all()
    serializer_class = TagSer

    def get_serializer_class(self):
        # self.request
        # self.args
        # self.kwargs
        if self.request.method == 'GET':
            return TagSer
        elif self.request.method == 'POST':
            return OtherTagSer
    def perform_create(self,serializer):
        serializer.save(author=1)

class TagDetailView(RetrieveAPIView,UpdateAPIView,DestroyAPIView):
    queryset = models.Tag.objects.all()
    serializer_class = TagSer

总结:

1.ser.save(author=1)
  # 没有在serializer校验的字段提交到数据库

2.  content = serializers.CharField(source='articledetail.content')
    author = serializers.CharField(source='author.username')
    category = serializers.CharField(source='get_category_display')
    date = serializers.SerializerMethodField()
    class Meta:
        model = models.Article
        fields = '__all__'
    def get_date(self,obj):
        obj.date.strftime('%Y-%m-%d %H:%M')

    # __all__,可以将source等字段,都显示出来
    # 格式化时间strftime

原文地址:https://www.cnblogs.com/liubing8/p/11827591.html

时间: 2024-08-29 22:48:01

Drf03 /呼啦圈网页初步实现、drf筛选、视图(源码实现)的相关文章

DRF之APIView源码解析

目录 Django项目中的代码如下 APIView源码解析 源码解析总结 Django项目中的代码如下 urls.py中: from django.conf.urls import url from app import views urlpatterns = [ url(r'^test/$', views.APIViewSourceCode.as_view()), ] views.py中: from rest_framework.views import APIView class APIVi

Android网络:HTTP之利用HttpURLConnection访问网页、获取网络图片实例 (附源码)

http://blog.csdn.net/yanzi1225627/article/details/22222735 如前文所示的TCP局域网传送东西,除了对传输层的TCP/UDP支持良好外,Android对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口: 1.标准Java接口(java.net) ----HttpURLConnection,可以实现简单的基于URL请求.响应功能: 2.Apache接口(org.appache.http)----HttpClient,使用起来更方

【C#】WinForm 之 DOTA2英雄搭配助手(网页抓取+在线绿色版+源码开放)

睡不着,无聊......再整理点好玩的出来.先上图 效果 碎碎念 自从13级后打出DOTA2的天梯积分以来简直是逆水行舟不进则退啊,室友已经高呼着被游戏玩了!!结果怒删游戏 其实我也发现这游戏不合适我玩…天梯里场场被各种选英雄针对,普通场又是剑圣.斧王横行.加之本人比较懒,不爱看视频,场均10死那是常有的事(打起来跟打WOW战场一样,反正死了有复活:P) 不瞎扯了,其实初衷就是不想被针对(想选个最脏阵容神马的我会告诉你嘛) 核心功能 这里要从Dotamax(http://dotamax.com/

MMORPG网页游戏斩仙录全套源码(服务端+客户端)

斩仙录全套源码(服务端+客户端),<斩仙录>是一款具有浓厚中国风的仙侠MMORPG网页游戏,游戏的背景取材于中国瑰丽多姿的神话故事和民间佳传,玩家可以穿越时空与不同时代的著名人物相遇,共同演绎改编自<山海经>.<白蛇传>.<倩女幽魂>.<画皮>.<精卫填海>.<西游记>.<封神榜>等传世佳作中的精彩桥段. 游戏的美术神话风很强,服务端用c++开发,网页端用flash as+js开发,含fla源文件,解压后702

drf模块及源码

drf中的APIView请求生命周期 APIView的as_view(局部禁用csrf) => 调用父类view中的as_view返回view()方法 => 自己的类调用自己的dispatch方法发送请求(drf的displatch中重写了错误分支,可以判断三大认证之前的错误,保证服务端请求安全,也可以判断逻辑中的错误) => 分发前完成request的二次封装,进行数据解析, => 三大认证 => 请求的实际响应(根据自己视图类的处理分发) => 其中出现异常,就会交

21款网页版html5小游戏源码

html5魅族创意的贪食蛇游戏源码下载 html5网页版打砖块小游戏源码下载 html5 3D立体魔方小游戏源码下载 html5网页版飞机躲避游戏源码下载 html5三国人物连连看游戏源码下载 js html5 2048数字游戏源码_2048网页版源码下载 html5盲打高手打飞字游戏下载_网页版英文打飞字游戏源码下载 jQuery flappy bird电脑版小游戏源码下载 网页版html5 3d俄罗斯方块游戏源码下载 jQuery html5迷宫游戏源码下载 html5网页游戏仿flappy

REST、DRF(View源码解读、APIView源码解读)

一.REST 1.什么是编程? 数据结构和算法的结合 2.什么是REST? 首先我们回顾下我们之前的图书管理系统,我们设计了这样的URL,如下: 127.0.0.1:9001/books/ 127.0.0.1:9001/get_all_books/ 访问所有的数据 127.0.0.1:9001/books/{id}/ 127.0.0.1:9001/books/{id}?method=get 访问单条数据 127.0.0.1:9001/books/add/ 127.0.0.1:9001/books

Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源码)

使用意图筛选器 点击下载源码 1.创建一个Intents项目,给该项目添加一个新类,命名为MyBrowserActivity,在res/layout文件夹下新增一个browser.xml: 2.在AndroidManifest.xml文件中添加如下代码: 添加权限: <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="a

Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先设置一下授权回调域.这里瞬间想到之前做JSSDK的时候,也设置过一个域名.二者本质上都是设置可信域名. 当用户授权完毕之后,请求将重定向到此域名(或者子域名)下的执行者(jsp页面或者servlet等).如何设置授权回调域,请见第二节. 1.2 获取Code https://open.weixin.