目录
一.admin管理后台
1.创建后台管理账号
2.注册自定义模型类
3.模型管理器
?二.关系映射
1.一对一映射
2.一对多映射
3.多对多映射
三.会话
1.cookies
?2.session
一.admin管理后台
django提供了比较完整的后台管理数据库的接口,可供开发调试,
djanog会搜集所有已注册的模型类,为开发者提供管理页面
1.创建后台管理账号
#manage.py同名文件夹下
python3 manage.py createsuperuser
#创建超级管理员
2.注册自定义模型类
#在admin.py中
from .models import Book
admin.site.register(Book)
3.模型管理器
修改admin页面的自定义类的部分功能
#在admin.py中
from .modles import admin
class BookManger(admin.ModelAdmin):
#在后台显示那些列
list_display=['属性']
#让那个字段做超链接
list_display_links=['属性']
#添加过滤器
list_filter=['属性']
#给那个字段添加模糊搜索
seacher_fields=['属性']
#添加可在列表页编辑的字段
list_editable=['属性']
admin.site.register(Book,BookManager)
?二.关系映射
在关系型数据库中,通常不会把所有数据放入同一张表中,不利于扩展,常见的关系映射有三种:
1.一对一映射
a)创建表
class Author(models.Model):
naem=...
class Wife(models.Moels):
name=..
author=models.OneToOneField(Author,on_delete=..)
on_delte是级联删除方式,有很多选项:
- modles.CASCADE:django模拟SQL的ON_DELETE的行为,并删除包含ForeignKey的对象
- models.PPROTECT:抛出ProjectedError,以防止删除(等同于mysql的RESTRICT)
- SET_NULL:设置ForeignKey null;需要指定null=True
- SET_DEFAULE:将ForignKey设置为默认值,必须先行设置默认值
?一般来说属性名为对应表的小写,在数据库中是属性名_对应主键名
?b)创建数据
无外键的模型类:
author1=Author.objects.create(name='')
有外键的模型类
#有两种方式
wife1=wife.objects.create(name='',author=author1)
#关联属性=obj对象
whife1=Wife.objects.create(name='',author_id=1)
#关联对应主键值=具体值
c)查询数据
正向查询(通过外键属性查询):
#通过wife查author
from .models import wife
wife=Wife.objects.get(name='')
print('对应作家是'wife.author.name)
反向查询(没有外键的一方查询设置外键的一方):
author=Author.objects.get(name='')
author1.wife.name
#若反向引用不存在,会触发异常
2.一对多映射
a)创建表
class Pub(models.Model):
name=models.charField(..)
class Book(models.Model):
title=...
pub=ForeignKey(Pub,on_delete=..)
#必须指定on_delete
b)创建数据
#注意先创建一再创建多
from .models import *
pub1=Pub.objects.create(name='')
book1=Book.onjects.create(name='',publish=pub1)
book2=Book.onjects.create(name='',publish_id=1)
#创建数据依旧是两种方式
c)查询数据
正向查询:
book=Book.objects.get(name='')
book.pub.name
反向查询:
pub1=Pub.objects.get(name='')
#两种方式查询对应出版社所有书
books=pub1.book_set.all()
boosk=Book.objects.filter(pub=pub1)
3.多对多映射
在MySQL中依靠第三张表来实现,在django中自动生成
?a)创建表
class Author(.)
name=..
class Book(.)
name=..
authors=models.ManyToManyField(Author)
b)创建数据
#方案一,先创建author,在关联book
author1= Author.objects.create(name='1')
author2= Author.objects.create(name='2')
book1=author.book_set.create(name='')
author2.book_set.add(book1)
#先创建book,再关联author
book2= Book.objects.create(name='2')
author3= book.authors.create(name='3')
book2.author.add(author3)
c)查询数据
正向查询:
book=Book.objects.get(name='')
book.author.all()
反向查询:
author=Author.objects.get(neame='')
author.book_set.all()
三.会话
从访问一个网站到关闭结束访问,成为一次会话
HTTP是无状态的,导致会话状态难以baochi
cookies和session就是为了保持会话状态的技术
1.cookies
cookies是保存在用户浏览器上的储存空间,
- 以键值对形式存储的
- 存储的数据带有生命周期
- cookies的数据是按域隔离的,不同域之间不能访问
- cookies里的数据每次访问时都会传输到服务器端,如果数据过大会影响响应速度
cookies的使用
def set_cookies(request):
res=HttpResponse('set cooikes ok')
res.set_cookies(key,value='',max_age=..,exprires=..)#设置与修改
return res
#key:名字,value:值,max_age:存活时间,exprires:具体失效时间
#若后两个参数不指定,默认持续到关闭浏览器
def get_cookies(request):
value=request.COOKIES.get(cookies_name,'默认值')#获得cookies
res=HttpResponse('del cooikes ok')
res.delete_cookies(key)#删除cookies
return res
?
?2.session
session是在服务器上开辟一片空间(数据库)来保存浏览器和服务器交互时的重要数据
- 使用session需要客户端启动cookies,且在cookies中存储sessionid
- 每个客户端在服务器都有一个独立的session,不同请求者数据不相通
session的配置(settings.py):
- ?INSTALLED_APPS中启用‘django.contrib.sessions'
- MIDDLEWARE启用'django.contrib.sessions.middleware.SessionMiddleware'
session的使用
#添加
request.session['key']=value
#获得
value=request.session.get('key','default')
#删除
del request.session['key']
?注:由于django_session表是单表设计,且该表数据量储蓄增加,所以可每过一段时间执行
python3 manage.py clearsessions
来删除以过期的session数据
|