python-django-06

 Django-06 后台管理和连接查询

 

1、CRUD
    1、查询
        1、Entry.objects.all()
        2、Entry.objects.all().values('','')
        3、Entry.objects.order_by()
        4、Entry.objects.exclude(条件)
        5、Entry.objects.get(条件)
            只能返回一条数据时使用
        6、Entry.objects.filter(条件|查询谓词)
            Author.objects.filter(id=1,age=10)
            Author.objects.filter(id__gte=10)
    2、增加数据
        1、Author.objects.create(属性=值)
        2、obj = Author(属性=值)
             obj.save()
        3、
            dic = {'属性':''}
            obj = Author(**dic)
            obj.save()
    3、修改数据
        1、单条记录
            obj = Author.objects.get(id=1)
            obj.属性=值
            obj.save()
        2、批量修改
            Author.objects.all().update(属性=值)
    4、删除
        1、删除单个对象
            Author.objects.get(id=1).delete()
        2、删除多个对象
            Author.objects.all().delete()
    5、F()操作 和 Q()操作
        1、F()操作
            作用:获取某列的值
            from django.db.models import F

            Author.objects.all().update(age=F('age')+10)
        2、Q()操作
            查询Author中id小于等于10或年龄大于等于35
            from django.db.models import Q
            Author.objects.filter(Q(id__lte=10)|Q(age__gte=35))
    6、原生的数据操作
        1、查询
            函数:raw()
            语法:Entry.objects.raw(sql)
        2、增删改
            def execute(request):
                with connection.cursor() as cursor:
                    sql = ""
                    cursor.execute(sql)
                    ... ...
===========================================
一、使用后台管理Models
    后台登录地址:http://localhost:8000/admin
    1、创建后台管理员
        ./manage.py createsuperuser
        Username:
        Email Address:
        Password:
        Password(again):
    2、基本管理
        1、在应用中的admin.py中注册要管理的数据
            1、admin.py
                作用:注册需要管理的Models,只有在此注册的Model才允许被管理,否则无法管理
            2、注册Model
                from .models import *
                admin.site.register(Entry)
                ex:
                    admin.site.register(Author)
            3、修改 models.py 处理显示内容
                后台默认效果可读性不高
                在models.py中的各个 class 中追加

                def __str__(self):
                    return self.name
            4、通过内部类Meta实现展现的属性
                允许为每个 model 类设置内部类 Meta 来设置起展现形式

                class Author(models.Model):
                    .... ....
                    .... ....
                    .... ....

                    class Meta:
                        1、db_table : 指定该实体类对应到表的名称
                        2、verbose_name : 定义该实体类在 admin 中显示的名字(单数形式)
                        3、verbose_name_plural : 效果同上,是复数形式
                        4、ordering :在后台显示数据时的排序规则,取值为一个 列表,默认是按升序,降序的话则添加 '-'
    3、高级管理
        1、在 admin.py 中创建管理类,实现高级管理功能
            1、定义 EntryAdmin 类,继承自 admin.ModelAdmin
                class AuthorAdmin(admin.ModelAdmin):
                    pass
            2、注册 高级管理类
                admin.site.register(Entry,EntryAdmin)

                admin.site.register(Author,AuthorAdmin)
            3、允许在EntryAdmin增加的属性
                1、list_display
                    作用:在显示实体信息的页面上,都显示哪些字段
                    取值:由属性名组成的元组或列表
                    ex:
                        list_display=('name','age','email')
                2、list_display_links
                    作用:定义能够链接到具体实体页面的链接们
                    取值:由属性名组成的元组或列表
                    注意:取值要必须出现在 list_display 中
                    ex:
                        list_display_links=('name','email')
                3、list_editable
                    作用:定义在列表页面中允许被修改的字段
                    取值:由属性名组成的元组或列表
                    注意:list_editable的值不能出现在list_display_links中
                4、search_fields
                    作用:添加允许被搜索的字段
                    取值:由属性名组成的元组或列表
                5、list_filter
                    作用:在列表的右侧增加过滤器,实现快速筛选
                    取值:由属性名组成的元组或列表
                6、date_hierarchy
                    作用:在顶部增加一个时间选择器,所以取值必须是 DateField 或 DateTimeField 的列
                7、fields
                    作用:在实体的详细页面中,显示哪些属性,并按照什么样的顺序显示
                    取值:由属性名组成的元组或列表
                8、fieldsets
                    作用:在实体的详细页面中,对属性进行分组
                    注意:fieldsets 与 fields 不能共存
                    语法:
                        fieldsets=(
                            ('分组名称',{'fields':(属性1,属性2),'classes':('collapse')}),
                        )
            练习:
                1、为Publisher增加高级管理功能
                    1、在实体列表页上显示 name,address,city属性
                    2、address和city是可以被编辑的
                    3、点击 name 时能够进入到实体详细页面中
                    4、右侧增加一个过滤器,允许按照address 和 city 进行筛选
                    5、分组显示
                        name,address,city 为基本选项
                        country,website 为可选选项,并可以折叠
二、Django连接查询
    1、一对一映射(1:1)
        1、什么是一对一
            A表中的一条记录只能与B表中的一条记录匹配关联
            典型代表:一夫一妻制
            数据库中的实现:
                A表:设计主键
                B表:有主键,增加一列,并引用A表中的主键值,还得增加一个唯一约束
        2、语法
            属性 = models.OneToOneField(Entry)

        3、查询
            class Wife(models.Model):
                .... ....
                author = models.OneToOneField(Author)

            正向查询:通过 wife 找 author
                w = Wife.objects.get(id=1)
                a = w.author

            反向查询:通过 author 找 wife
                a = Author.objects.get(id=1)
                w = a.wife

                wife 是由Django通过OneToOneField在Author中默认增加的一个属性
    2、一对多映射(1:M)
        1、什么是一对多
            A表中的一条数据可以与B表中的任意多条数据匹配

            比如 出版社 和 书籍 之间的关系

        2、语法
            使用 外键(Foreign Key)
            属性 = models.ForeignKey(实体类)

            ex:
                Book(M) 和 Publisher(1)

                class Book(models.Model):
                    ... ...
                    publisher = models.ForeignKey(Publisher)
        3、查询
            Book(M) 和 Publisher(1)

                class Book(models.Model):
                    ... ...
                    publisher = models.ForeignKey(Publisher)

            1、正向查询 - 通过 Book 查询 Publisher
                book = Book.objects.get(id=1)
                publisher = book.publisher
            2、反向查询 - 通过 Publisher 查询 Book
                publisher = Publisher.objects.get(id=1)
                通过 publisher.book_set.all()得到所有的关联数据
                bookSet = publisher.book_set.all()

 

三、Django中的连接查询
    1、多对多查询
        1、什么是多对多
            A表中的一条记录可以与B表中的任意多条记录匹配,同时B表中的每一条记录也可以与A表中的任意多条记录相匹配
        2、语法
            entry = models.ManyToManyField(Entry)
        3、查询
            class Author(models.Model):
                ... ...
                publish = models.ManyToManyField(Publish)
            
            正向查询:在 Author 中查询 Publish
                author = Author.objects.get(id=3)
                pub_list=author.publish.all()

                通过关联属性.all()
            反向查询:在 Publisher 中查询 Author
                pub = Publisher.objects.get(id=1)
                auList = pub.author_set.all()

            练习:
                创建 Author 与 Book 之间的多对多关系
                1、查询 贾乃亮 出版的 所有的书籍
                2、查询 红楼梦 的作者们都有谁
四、自定义查询对象 - objects
    1、声明类 EntryManager,继承自models.Manager,并添加自定义函数
        class EntryManager(models.Manager):
            def  函数名(self,自定以参数):
                ... ...
                return ...
    2、使用EntryManager 覆盖 Models中的objects
        class Entry(models.Model):
            objects = EntryManager()

    练习:
        1、为 Author 指定自定义objects 对象
            包含以下操作:
            1、年纪小于指定年纪的所有的作者的信息
        2、为 Book 指定自定义objects对象
            包含以下操作:
            1、查询书名中包含指定关键字的书籍的数量
五、HttpRequest 介绍
    1、什么是HttpRequest
        HttpRequest,请求对象,封装了请求过程中的所有信息
        在Django中,HttpRequest 被化身成了 request封装到视图处理函数中作为参数.该参数,在调用视图处理函数时自动传入
        print(dir(request))
    2、HttpRequest 中的主要内容
        1、request.scheme : 请求协议
        2、request.body 请求主体
        3、request.path 请求路径
        4、request.get_host() 请求的主机地址 / 域名
        5、request.method 请求方法
        6、request.GET get的请求数据
        7、request.POST post的请求数据
        8、request.COOKIES cookies的数据
        9、request.META 请求的元数据
    3、有关HTTP协议
        1、每个请求一定会有 method
            get,post,put,delete,... ...

            get:向服务器要数据时使用
                传递数据到服务器时会直接将请求数据封装到地址之后

                http://www.baidu.com/s?wd=佳能&price=3000
            
            post:想传递数据到服务器处理的时候,用post
                post的请求提交的数据全部封装在 "请求主体"2、请求主体
            只有post 和 put 请求方式才能产生请求主体
            其他请求方式都没有请求主体
    4、获取请求提交的数据
        1、GET请求
            request.GET['名称']
        2、POST请求
            request.POST['名称']
4、csrf 跨站点攻击
    目的:为了解决跨站点发送post请求
    解决方案:
        1、删除 CsrfViewMiddleWare 中间件
        2、在视图函数增加@csrf_protect
        3、
            在模板中 <form> 底下第一行增加一个标签{%csrf_token%}

            <form method="" action="">
                {%csrf_token%}
            </form>







Author.objects.all()
Author.objects.myself()

['COOKIES', 'FILES', 'GET', 'META', 'POST', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_encoding', '_get_post', '_get_raw_host', '_get_scheme', '_initialize_handlers', '_load_post_and_files', '_mark_post_parse_error', '_messages', '_post_parse_error', '_read_started', '_set_post', '_stream', '_upload_handlers', 'body', 'build_absolute_uri', 'close', 'content_params', 'content_type', 'csrf_processing_done', 'encoding', 'environ', 'get_full_path', 'get_host', 'get_port', 'get_raw_uri', 'get_signed_cookie', 'is_ajax', 'is_secure', 'method', 'parse_file_upload', 'path', 'path_info', 'read', 'readline', 'readlines', 'resolver_match', 'scheme', 'session', 'upload_handlers', 'user', 'xreadlines']

 

posted on 2019-07-24 09:41  微子天明  阅读(116)  评论(0编辑  收藏  举报

导航