python全栈开发day67--字段类型、字段属性、ORM回顾

一、回顾总结

https://www.cnblogs.com/maple-shaw/articles/9323320.html

1. 视图
        1. CBV 和 FBV
            from django.views import View
            
            class AddPublisher(View):
                
                def dispatch(self, request, *args, **kwargs):
    
                    ret = super().dispatch(request, *args, **kwargs)

                    return ret
                    
                def get(self,request):
                    pass
                    
                def post(self,request):
                    pass
            使用:
                url(r'^add_publisher/', views.AddPublisher.as_view()),        
                    
        2. CBV的简单的流程
            1. AddPublisher.as_view()得到一个view函数
                url(r'^add_publisher/', view),
            2. 请求到来的时候 执行view:
                1. 实例化AddPublisher的类,赋值给self
                2. 执行dispatch方法 
                3. 通过反射获取到get或者post的方法
                4. 执行get或者post方法,返回HttpResponse对象
        3. 装饰器的使用
            1. FBV 正常使用  
                @装饰器
                
            2. CBV 
                from django.utils.decorators import method_decorator
                
                1. 给get或者post方法加
                2. 给dispatch方法加
                3. 给类加(写name='get'4. request
            request.method        请求方法 GET POST
            request.GET            URL传参  {}
            request.POST        form表单传的参数
            request.body        请求体
            request.FILES       上传的文件
            request.path_info   URL路径   不包含域名和URL参数
            
            request.get_full_path()   URL路径包含URL参数
            request.get_host()      获取IP和端口
        5. response
        
            1. HttpResponse('字符串')    —》 页面看到的就是字符串  content—type: text/html;charset=utf8
            2. render(request,'HTML文件名',{参数})        ——》返回一个页面
            3. redirect('/index/')        跳转 重定向  返回一个响应头  Location:'/index/'
            4. JsonResponse(字典)    content—type: application/json 
                返回列表时     safe=False
                JsonResponse(data,safe=False)
        
    2. 路由
        1.
            from django.conf.urls import url
            
            urlpatterns =[
                url(正则表达式,视图,参数,name)
                url(正则表达式,视图,参数,name)
                url(正则表达式,视图,参数,name)
            ]
        2. 正则表达式
            加$  
            [0-9]  /d
            + 一个或多个
            ?0个或1个
            * 0个或多个
            . 除了换行符的所有
            
        3. 分组和命名分组
            
            url(r'book/[0-9]{4}/[0-9]{2}/',views.book)
            
            无名分组:
                url(r'book/([0-9]{4})/([0-9]{2})/',views.book)
                按照位置传参的方式传给视图
                
            
            命名分组
                url(r'book/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/',views.book)
                按照关键字传参的方式给视图
                
            捕获到的参数都是字符串
            
        4. 命名url和url的反向解析
            
            url(r'home',view,home,name='home')
            url(r'book/([0-9]{4})/([0-9]{2})/',views.book,name='book')
            url(r'book/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/',views.book,name='book2')
            
            
            视图中反向解析URL:
                from django.shortcuts import reverse
                
                reverse('home')    ——》 /home/
                reverse('book',args=('1999','08'))        ——》/book/1999/08/
                reverse('book2',kwargs={'year':'1998','month':'08'})  ——》 /book/1998/08/
                
                
            模板中反向解析URL:
                {% url 'home' %}  ——》 /home/
                无名分组:
                
                    {% url 'book' '1999' '08' %}  ——》/book/1999/08/
                
                有名分组:
                    {% url 'book' '1999' '08' %}  ——》/book/1999/08/
                    {% url 'book' year='1999' month='08' %}  ——》/book/1999/08/
                    {% url 'book' month='08' year='1999' %}  ——》/book/1999/08/
                
        5. include 
            from app01 import urls as app01_urls
            from app02 import urls as app02_urls
        
            url('app01/', include(app01_urls)),
            url('app02/', include(app02_urls))
            
            
            
            url('app01/', include('app01.urls')),
            url('app02/', include('app02.urls'))
            
        5. namespace
            
            
    3. ORM
        1. mysql的配置
            1. 创建mysql数据库
            2. settings配置
                ENGINE:    'mysql'
                NAME: '数据库名称'
                HOST:IP
                PORT: 3306
                USER: 'root'
                PASSWORD: ''
                
            3. 告诉django使用pymysql来连接mysql数据库
                在项目同名的文件夹下的__init__.py中写:
                    import pymysql
                    pymysql.install_as_MySQLdb()
                    
            4. 创建model
                class Person(models.Model)
                    name = models.CharField(max_length=32)
                    
            5. 执行两条数据库命令
                python manage.py makemigrations   # 记录models的变更记录
                python manage.py migrate         # 把变革记录更新到数据库中
                
        2. ORM操作
        
            1. 查
                models.Person.objects.all()  # 查所有
                models.Person.objects.get(id=1,name='xxx')    # 查一个对象 满足条件的
                models.Person.objects.filter(id=1,name='xxx')  # 查询满足条件的所有对象 列表
                models.Person.objects.filter(id=1,name='xxx').order_by('id')  
                
                属性:
                    pub_obj.name
                    
                    外键的 book
                    book_obj.name
                    book_obj.publisher   ——》 这是书籍关联的出版社对象 
                    book_obj.publisher_id   ——》 这是数据库存的数据
                    book_obj.publisher.id   
                    book_obj.publisher.name 

                    多对多 author
                    
                    author.name
                    
                    author.books    ——》 多对多的管理对象
                    author.books.all()   所有作者关联的书籍对象列表 
                    
            2. 增加:
                models.Publisher.objects.creatte(name='xxxx')
                
                外键
                models.Book.objects.creatte(name='xxxx',publisher=pub_obj)
                models.Book.objects.creatte(name='xxxx',publisher_id=pub_obj.id)
                
                多对多
                
                author_obj = models.Author.objects.creatte(name='xxx')
                author_obj.books.set([1,2,3])
                
            3. 删除
                models.Publisher.objects.get(id=1).delete()
                models.Publisher.objects.filter(id=1).delete
                
            4. 修改
                
                pub_obj.name = new_name
                pub_obj.save()
                
                book_obj.name= new_name
                book_obj.publisher = new_pub_obj
                book_obj.publisher_id = 2
                book_obj.save()
                
                author_obj.name=new_name
                author_obj.save()
                author_obj.books.set([1,2])
回顾总结

二、预习和拓展

1.上台阶问题

     

    

def  f(n):
    if  n ==1:
        return 1
    elif n==2:
        return 2
    elif n ==3:
        return 4
    return f(n-1) + f(n-2) + f(n-3)
上台阶代码实现

2. 自定义固定长度char字段

 

class MyCharField(models.Field):
    def __init__(self,max_length,*args,**kwargs):
        self.max_length = max_length
        super(MyCharField,self).__init__(max_length,*args,**kwargs)
    
    def db_type(self,connection):
         return "char(%s)" % self.max_length
MyCharField

  cname = MyCharField(max_length=25)

2.ORM查!

原文地址:https://www.cnblogs.com/wuchenggong/p/9407177.html