django基础知识(四)
文章目录
admin后台管理
- django提供了比较完善的后台管理数据库的接口,可供开发过程中调用和测试使用
- django会搜集所有已注册的模型类,为这些模型类提供数据管理界面,供开发者使用
admin配置步骤:
创建后台管理账号:python manage.py createsuperuser
打开http://127.0.0.1:8000/admin/login/?next=/admin/
管理后台用户和组配置
注册自定义模型类:
在应用app中的admin.py中导入注册要管理的模型models类,如:from .models import Book
调用admin.site.register方法进行注册,如:admin.site.register(自定义模型类)
修改自定义模型类的数据样式:
在admin后台管理数据库中对自定义的数据记录都显示为‘XXXX object’类型的记录。
在用户自定义的模型类中可以重写def__str__(self):方法解决显示问题,如:
class Book(models.Model):
...
def __str__(self):
return "书名" + self.title
模型类管理器类
-
作用:为后台管理界面添加便于操作的新功能
-
说明:后台管理器类须继承自django.contrib.admin里的ModelAdmin类
-
使用方法:
1.在<应用app>/admin.py里定义模型管理器类: class XXXXManager(admin.ModelAdmin): list_display=['','','',''] #Admin的列表页显示哪些字段的列 list_display_links = [''] #控制list_display中哪些字段可以链接到修改页面 list_filter = ['pub'] #添加过滤器 search_fields = ['title'] #添加搜索框【模糊查询】 list_editable = ['price'] #添加可在列表页编辑的字段 #在list_display中,与list_display_links互斥 2.绑定注册模型管理器和模型类 from django.contrib import admin from .models import * admin.site.register(YYYY,XXXXManager) #绑定YYYY模型类与管理器类XXXXManager
再谈Meta类
class Book(models.Model):
title = CharField(...)
class Meta:
1.db_table = '数据表名' #该模型所用的数据表的名称
2.verbose_name = '单数名' #给模型对象一个易于理解的名称(单数),用于显示在/admin管理界面中
3.verbose_name_plural = '复数名' #该对象复数形式的名称(复数),用于显示在/admin管理界面中
关系映射
关系型数据库中,通常不会把所有数据都放在同一张表中,不易于扩展,常见关系映射有:
一对一映射
-
语法:
OneToOneField(类名,on_delete=xxx) class A(model.Model): ... class B(model.Model): 属性 = models.OneToOneField(A, on_delete=xxx) *特殊字段选项【必须】 on_delete 级联删除 1.models.CASCADE 级联删除。Django模拟SQL约束ON DELETE CASCADE的行为,并删除包含ForeignKey的对象 2.models.PROTECT抛出ProtectedError以阻止被引用对象的删除;[等同于mysql默认的RESTRICT] 3.SET_NULL设置ForeignKey null; 需要指定null=True 4.SET_DEFAULT 将ForeignKey设置为其默认值;必须设置ForeignKey的默认值
-
创建数据:
-
无外键的模型类[Author]:
author1 = Author.objects.create(name='王老师')
-
有外键的模型类[Wife]:
wife1 = Wife.objects.create(name=’王夫人‘,author=author1) #关联王老师obj wife2 = Wife.objects.create(name=’王夫人',author_id=1) #关联王老师对应的主键值
-
-
查询数据:
-
正向查询:直接通过外键属性查询,则称为正向查询
#通过wife找author from .models import wife wife = wife.objects.get(name='王夫人') print(wife.name,'的老公是',wife.author.name)
-
反向查询:没有外键属性的一方,可以调用反向属性查询到关联的另一方
反向关联属性:示例对象.引用类名(小写),不存在时会引发异常author1 = Authoer.objects.get(name='王老师') author1.wife.name
-
一对多映射
-
语法:当一个A类对象可以关联多个B类对象时:
class A(model.Model): ... class B(model.Model): 属性 = models.ForeignKey('一'的模型类,on_delete=xx)
-
创建数据:先创建‘一’ 再创建‘多’
from .models import * pub1 = Publisher.objects.create(name='清华大学出版社') Book.objects.create(title='C++',publisher=pub1) Book.objects.create(title='Java',publisher_id=1)
-
查询数据:
-
正向查询:通过Book查询Publisher
abook = Book.objects.get(id=1) print(abook.title,'的出版社是:',abook.publisher.name)
-
反向查询:通过Publisher查询对应的所有的Book
publisher = Publisher.objects.get(name=’清华大学出版社‘) books = pub1.book_set.all() #通过book_set获取pub1对应的多个Book数据对象 books = Book.objects.filter(publisher=pub1) for book in books: print(book.title)
-
多对多映射
-
定义:MySQL中创建多对多需要依赖第三张表来实现
Django中无需手动创建第三张表,Django自动完成 -
语法:在关联的两个类中的任意一个类中,增加:
属性 = models.ManyToManyField(MyModel)
authors = models.ManyToManyField(Author) -
创建数据:
-
方案一:先创建author再关联book
author1 = Author.objects.create(name='吕老师') author2 = Author.objects.create(name='王老师') #吕老师和王老师同时写了一本python book11 = author1.book_set.create(title='Python') author2.book_set.add(book11)
-
方案二:先创建book再关联author
book = Book.objects.create(title='python1') #郭老师和吕老师都参与了python1的创造 author2 = book.authors.create(name='python1') book.authors.add(author1)
-
-
查询数据:
-
正向查询:有多对多属性的对象 查 另一方:通过Book查询对应的所有的Author
book.authors.all()-->获取book对应的所有author的信息 book.authors.filter(age__gt=80)
-
反向查询:通过Author查询对应的所有Book
author.book_set.all() author.book_set.filter()
-
cookies和session
会话
从打开浏览器访问一个网站,到关闭浏览器结束这次访问,称之为一次会话
HTTP协议是无状态的,导致会话状态难以保持
Cookies和Session就是为了保持会话状态而诞生的两个存储技术
cookies -存储在浏览器
-
定义:cookies是保存在客户端浏览器上的存储空间
-
特点:
- cookies在浏览器上是以键值对的形式进行存储的,键和值都是以ASCII字符串的形式存储(不能是中文字符串)、
- 存储的数据带有生命周期
- cookies中的数据是按域存储隔离的,不同的域之间无法直接访问
- cookies的内部的数据会在每次访问此网站时都会携带到服务器端,如果cookies过大会降低响应速度
-
使用–存储
HttpResponse.set_cookie(key,value='',max_age=None,expires=None) -key:cookie的名字 -value:cookie的值 -max_age:cookie存活的时间,秒为单位 -expires:具体过期时间 -当不指定max_age和expires时,关闭浏览器时此数据失效 response = HttpResponse('') responds.set_cookie('my_val1',123,3600) return response
-
使用–删除&获取
-
删除cookies
HttpResponse.delete_cookie(key) 删除指定key的cookie,如果key不存在则什么也不发生
-
获取cookies
通过request.COOKIES绑定的字典(dict)获取客户端的COOKIES数据 value = request.COOKIES.get('cookie名','默认值')
-
session -存储在服务器
-
定义:session是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据
-
实现方式:
- 使用session需要在浏览器客户端启动cookie,且在cookie中存储sessionid
- 每个客户端都可以在服务器端有一个独立的Session
**注意:**不同的请求者之间不会共享这个数据,与请求者一一对应
-
session初始配置:
#在setting.py中配置 1.INSTALL_APPS=['django.contrib.sessions',] #默认配置session应用 2.MIDDLEWARE=['django.contrib.sessions.middleware.SessionMiddleware',] #默认开启
-
session的使用
-
session对象是一个类似于字典的SessionStore类型的对象,可以用类似于字典的方式进行操作
-
session能够存储如字符串,整型,字典,列表等。
1.保存session的值到服务器 request.session['KEY']=VALUE 2.获取session的值 value = request.session['KEY'] value = request.session.get('KEY',默认值) 3.删除session del request.session['KEY']
-
-
settings.py中相关配置项
- SESSION_COOKIE_AGE
- 作用:指定sessionid在cookies中的保存时长(默认是2周)
- 例:SESSION_COOKIE_AGE = 60602472
- SESSION_EXPIRE_AT_BROWSER_CLOSE = True
- 设置只要浏览器关闭时,session就失效(默认是False)
- 注意:Django中的session数据存储在数据库中,所以session使用前需确保已经执行过migrate
- Django session的问题
- django_session表是单表设计;且该表数据量持续增持【浏览器故意删掉sessionid&过期数据未删除】
- 可以每晚执行python3 manage.py clearsessions【该命令可删除已过期的session数据】
- SESSION_COOKIE_AGE