Django框架学习--6--admin&关系映射&保持会话状态

     阅读:45

本篇文章要点:

1.django提供的admin管理后台

2.django中的关系映射

3.如何保持会话状态?(cookie和session)

1.admin管理后台

admin概要

        django提供比较完善的后台管理数据库的接口,想要登录admin管理后台必须先创建超级用户的账号,使用语句(python3 manage.py createsuperuser);然后在(127.0.0.1:8000/admin/)进行登录;进入页面后可以看见如下已自定义好模型的内容:

 在管理后台中可以创建用户和组:

        在创建用户中,密码进行哈希运算,不可以逆运算,安全度有保证;且创建完成后可对其权限进行修改。

         所谓组的概念和部门差不多,你所属哪个部门就规定能做哪些事,组就是把能做的事统一放到一个组中,供用户选择,如下:

如何在admin后台管理自己的模型类?

注册自定义模型类:

  1. 在应用app中的admin.py中导入注册要管理的模型models类,如:from . models import Book
  2. 调用 admin.site.register(模型类名)方法进行注册

        但是上图看起来属性堆积在一起,不够清晰简洁,于是我们可以使用django提供的模型管理器类达到对上述页面修改的效果,也就是使用后端代码改变前端样式;

什么是模型管理器类?

        必须继承django.contrib.admin中的ModelAdmin类

使用方法:

  1. 在admin.py中定义模型管理器类
  2. 绑定注册模型管理器类和模型类
from django.contrib import admin
from .models import Book, Author
# Register your models here.

class BookManager(admin.ModelAdmin):
    # 列表页显示哪些字段的列,会显示verbose_name 第一个参数
    list_display = ['id', 'title', 'pub', 'price']
    # 控制list_diplay哪些可以连接到修改页
    list_display_links = ['title']
    # 添加过滤器
    list_filter = ['pub']
    # 添加搜索框(模糊查询)
    search_fields = ['title']
    #添加可在列表页编辑的字段
    list_editable = ['price']


class AuthorManager(admin.ModelAdmin):
    list_display = ['id', 'name', 'age']

admin.site.register(Book, BookManager)
admin.site.register(Author, AuthorManager)

最终实现效果如下:


2. 关系映射

常见的关系映射:一对多、一对一、多对多;那么这些关系在ORM中是如何实现的?

一对一

使用方法:

OneToOneField(类名,on_delete=xxx) #参数2为级联删除

on_delete字段

  1. 级联删除:当表与表之间产生关系时,定义的删除规则。
  2. models.CASCADE级联删除
  3. models.PROTECT有数据关联时,不可以删除,会抛出异常ProtectedError
  4. SET_NULL当null=True时,可以删除,外键指向null。
  5. SET_DEFAULT外键指向默认值。

在应用模型类中创建以下模型,实现一对一的对应关系:

#models.py
class Author(models.Model):
    # wife 反向属性
    name = models.CharField('姓名', max_length=11)

class wife(models.Model):
    name = models.CharField('姓名',max_length=11)
    author = models.OneToOneField(Author, on_delete=models.CASCADE)

一对一关系中有外键的模型类数据创建的两种方式:

author1 = Author.objects.create(name='王老师')
# 有外键的模型类数据创建的两种方式
wife1 = Wife.objects.create(name='王夫人', author=author1) #变量名 
wife2 = Wife.objects.create(name='王夫人', author_id= 1 或者 author1.id)# 字段名

查询数据:

正向查询:直接通过外键属性查询(身上有显性的属性)

from .models import wife

w1 = Wife.objects.get(name='王夫人')
print(w1.name,'的老公是',wife.author.name)

反向查询:没有外键属性的一方,调用反向属性查询(django提供的隐藏外键属性的类名小写)

a1 = Author.objects.get(name="王老师")
a1.wife.name

一对多

使用方法:

models.Foreignkey("一"的模型类, on_delete=xx)

一对多关系映射需在在多表上设置外键

在模型类中创建,然后在终端迁移数据:

class Publisher(models.Model):
    # [一]
    name = models.CharField('出版社名称', max_length=50)

class Book(models.Model):
    # [多]
    title = models.CharField('书名', max_length=11, unique=True)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)

在mysql中通过语句show create table otm_book;可以查询创建表的sql语句。

创建数据,同样是两种方法:

from .models import *
pub1 = Publisher.objects.create(name='清华大学出版社')
Book.objects.create(title='Python1', publisher=pub1)
Book.objects.create(title='Python1', publisher_id=1)

正向查询(从多的方向):

b1.publisher.name

反向查询(从一的方向):

pub1 = Publisher.objects.get(name='清华大学出版社')
books = pub1.book_set.all()#拿到出版社相关的所有书

多对多

 使用方法:

属性=models.ManyToManyField(MyModel)

在应用models.py中创建数据表模式:

class Author(models.Model):
    name  = models.CharField('姓名', max_length=11)

class Book(models.Model):
    title = models.CharField('书名', max_length=11)
    author = models.ManyToManyField(Author)

 之后在终端迁移数据后,会在mysql中看到django自动创建的第三张表,在数据库中叫做关系表,连接另外两张表不同数据行之间的关系。

创建数据,也有两种方式:

#先创建书再绑定作者
a1 = Author.objects.create(name='王老师')
b1 = a1.book_set.create(title='python')

a2 = Author.objects.create(name='李老师')
a2.book_set.add(b1)

正向查询(有mangtomangfield的):

book.authors.all()

book.authors.filter(ag__gt=80)

反向查询:

author.book_set.all()

author.book_set.filter()

3.cookies和session

        cookies和session实际上是两种存储技术;由于HTTP协议是无状态的,导致会话状态难以保持。所以要通过这两种技术去保持会话状态。

什么是会话?

        从打开浏览器访问一个网站到关闭浏览器结束此次访问,称之一次会话

Cookies

        保存在客户端浏览器中的存储空间,以firefox浏览器为例,我们可以在火狐->开发者工具->存储->cookie中找到。

  • cookies在浏览器上是以键-值对的形式存储的,键值对只能是ASCII字符串
  • 存储的数据带有生命周期
  • cookies中的数据是按域存储隔离的,不同域之间无法访问
  • cookies中的内部数据会在每次访问此网址时都会携带到服务器端,如果cookies过大会降低响应速度

cookies技术的原理:

  • 存储cookies在客户端
  • 读取cookies在浏览器

cookies登录:

Cookies相关操作

1.存储cookies

HttpResponse().setCookies(key,value,max_age, expire)

seCookies参数介绍:

  • key名称
  • value值
  • max_age相对时间
  • expires具体时间:不指定后两参数时,关闭brower时此数据失效 
#views.py
def set_cookies(request):

    resp = HttpResponse('set cookies is ok!')
    resp.set_cookie('uuname', 'gxn', 500)
    return resp 

刷新页面,查看响应头中会有一个Set-Cookie字段。

2.获取Cookies

通过request.COOKIES绑定的字典(dict)获取客户端的COOKIES数据

#views.py
def get_cookies(request):
    value = request.COOKIES.get('uuname')
    return HttpResponse('value is %s'%(value))
    

浏览器会在请求头把cookie数据传递给服务端

3.删除Cookies

HttpResponse.delete_cookie(key)#如果不存在什么则都不会发生

Session

         session是在服务器(django)上开辟一段空间用于保留浏览器和服务器交互时的重要数据,然后把sessionid存放在Cookies中,利用cookies的自动提交把sessionid提交给服务器来进行判断。

实现方式:

  • 使用session需要在浏览器客户端启动cookie,且cookie中存储sessionid
  • 每个客户端都可以在服务器端有一个独立的Session,与请求者一一对应

session初始配置:

在settings.py文件中必须有以下字段:(一般初始创建django时就会有)

INSTALLED_APPS中'django.contrib.sessions'

MIDDLEWARE中'django.contrib.sessions.middleware.SessionMiddleware'

使用方法:

session类似于字典的SessionStore类型的对象,可以用字典的方式使用。

#保存
def set_session(request):
    request.session['uname'] = 'arli'
    return HttpResponse('set session is ok')
#获取
def get_session(request):
    # 强取,session的存活时间与sessionid有关,没有则取不到
    value = request.session['uname'] 
    return HttpResponse('session value is %s'%(value))



注意事项:

  1. settings.py中SESSION_COOKIE_AGE 默认2周
  2. SESSION_EXPIRE_AT_BROWSER_CLOSE=True 关闭brower就会失效(默认为False)
  3. django中的session存放在数据库
  4. django_session表是单表设计;该表数据量持续增加,不会自动删除。
  5. python3 manage.py clearsessions删除已过期的session数据。

 课程地址:2021最新版Django全套视频(django框架快速上手)_Python全栈_哔哩哔哩_bilibili