呼啦圈

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

实现呼啦圈

ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
+
定义钩子方法

drf呼啦圈的更多相关文章

  1. 呼啦圈(keyframes和transform结合)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. drf

    跨域同源 django做跨域同源 需要把csrf去掉 跨站请求伪造 同源 同源机制:域名.协议.端口号相同的同源 简单请求 不写头部请求 跨域会拦截报错缺少请求信息 (1) 请求方法是以下三种方法之一 ...

  3. drf源码系列

    过滤器 对查询出来的数据进行筛选可写可不写 from rest_framework.filters import BaseFilterBackend 源码 ''' def filter_queryse ...

  4. drf(请求封装/认证/权限/节流)

    1.请求的封装 class HttpRequest(object): def __init__(self): pass @propery def GET(self): pass @propery de ...

  5. Drf06 /drf总结

    Drf06 /drf总结 目录 Drf06 /drf总结 1. restful规范 2. drf组件认证的实现过程? 3. drf组件中权限的实现过程? 4. drf组件中节流的实现方式? 5. 什么 ...

  6. restframework详细

    1.写视图的方法 1.1第一种:原始APIView url(r'^login/$',account.LoginView.as_view()), from rest_framework.views im ...

  7. webpack入门必知必会

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 这是我第一篇介绍webpack的文章,先从一个入门教程开始吧,后续会有更多相关webpack的文章推 ...

  8. JavaScript易错点转载

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  9. 写好你的JavaScript

    关于 微信公众号:前端呼啦圈(Love-FED) 我的博客:劳卜的博客 知乎专栏:前端呼啦圈 前言 在实际工作中,我们应该经常会看到一些功能上没有问题,但编码风格和规范却十分糟糕的代码,这往往会让人不 ...

随机推荐

  1. django操作非ORM创建的表

    问题:django的ORM怎么连接已存在的表,然后进行增删查改操作?     工作中会遇见很多二次开发的时候,表都是已经创建好的,用django的ORM进行二次开发,怎么操作数据库中的表呢? 下面介绍 ...

  2. Xming+SecureCRT的安装与使用

    博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 Xming下载地址:https://xming.en.softonic.com/ 安装完后打开文件位置: 一.Xming ...

  3. 3dmax2012卸载/安装失败/如何彻底卸载清除干净3dmax2012注册表和文件的方法

    3dmax2012提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dmax2012失败提示3dmax2012安装未完成,某些产品无法安装,也有时候想重新安装3 ...

  4. 视觉SLAM算法框架解析(3) SVO

    版权声明:本文为博主原创文章,未经博主允许不得转载. SVO(Semi-direct Visual Odometry)[1]顾名思义是一套视觉里程计(VO)算法.相比于ORB-SLAM,它省去了回环检 ...

  5. java生成饼图

    pom.xml文件导入依赖包 <!-- https://mvnrepository.com/artifact/org.jfree/jfreechart --> <dependency ...

  6. 浅谈Java转义符\\|

    看一段程序 String t = "a||b||c||d"; String[] temp = t.split("\\|\\|"); System.out.pri ...

  7. pytorch的visdom启动不了、蓝屏

    pytorch的visdom启动不了.蓝屏 问题描述:我是在ubuntu16.04上用python3.5安装的visdom.可是启动是蓝屏:在网上找了很久的解决方案:有三篇博文: https://bl ...

  8. 翻译:谷歌HTML、CSS和JavaScript风格规范

    我喜欢浏览风格规范.他们通常有明显的规则,虽然有些有荒诞之感,但是却可以发现之前未注意到的宝石.不幸的是,鲜有公司有这个勇气来发布自己内部的风格规范.BBC 2010年时候公开其文档以及Google最 ...

  9. mysql视图、事务、触发器、索引

    视图 什么是视图 ? 一个查询语句的结果是一张虚拟表,将这种虚拟表保存下来,它就变成了一个视图. 为什么要用视图? 当频繁需要用到多张表的连表结果,你就可以事先生成好视图,之后直接调用即可,避免了反复 ...

  10. Fence和非原子操作的ordering

    除了在原子操作中标记memory ordering外,还可以单独使用fence指定memory ordering.Fence是全局的操作,它影响所执行线程中其他原子操作的ordering. 12345 ...