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']