orm03

打印 上一主题 下一主题

主题 782|帖子 782|积分 2361

admin后台管理

什么是admin后台管理

django提供了比较完善的后台数据库的接口,可供开辟过程中调用和测试使用
django会搜集所有已注册的模型类,为这些模型类提供数据管理界面,供开辟使用

admin配置步骤

创建后台管理账号

该账号为管理后台最高权限账号


  • python3 manage.py createsuperuser
  1. $ python3 manage. py createsuperuser
  2. Username (leave blank to use 'root'): zhangsan                # 此处输入用户名
  3. Email address: zhangsan@1234.com                                        # 此处输入邮箱
  4. Password:                                                        # 此处输入密码(密码要复杂些,否则会提示密码太简单)
  5. Password(again):                                        # 再次输入重复密码
  6. Superuser created successfully.
复制代码
测试登录

启动服务后,后台管理的登录地点:http://127.0.0.1:8000/admin,使用刚才注册的管理员账号登录即可
实验:测试admin后台体系



  • 首先创建用户,在终端执行 python3 manage.py createsuperuser 下令
    1. (testenv) [root@localhost mysite3]# python3 manage.py createsuperuser
    2. 用户名 (leave blank to use 'root'): root
    3. 电子邮件地址: root@qq.com
    4. Password: 123456
    5. Password (again): 123456
    6. 密码长度太短。密码必须包含至少 8 个字符。
    7. 这个密码太常见了。
    8. 密码只包含数字。
    9. Bypass password validation and create user anyway? [y/N]: y  # 如果密码短需要手动确定
    10. Superuser created successfully.
    复制代码
  • 启动服务 django 服务
    1. (testenv) [root@localhost mysite3]# python3 manage.py runserver
    复制代码
  • 后台管理的登录地点:http://127.0.0.1:8000/admin

注册自定义模型类



  • 若要自己定义的模型类也能在admin后台管理体系界面中显示和管理,需要将自己的类注册到后台管理界面
注册步骤



  • 在应用app中的 admin.py 中导入注册要管理的模型 models 类,如:from .models import Book
  • 调用 admin.site.register 方法举行注册,如:admin.site.register(自定义模型类)
  • 案例
    1. # file: bookstore/admin.py
    2. from django. contrib import admin
    3. # Register your models here.
    4. from . import models
    5. ...
    6. admin. site.register(models.Book)# 将Book类注册为可管理页面
    复制代码
  • 修改自定义模型类的数据样式

    • admin后台管理数据库中对自定义的数据记载都展示为 XXX object 类型的记载,不便于阅读和理解
    • 在用户自定义的模型类中可以重写 def str(self)方法办理显示题目,如:


实验:注册模型类




  • 修改 bookstore 应用下的 admin.py 文件
    1. from django.contrib import admin
    2. # 方式一:引入模型模块,使用模型类: `models.模型类名`,例如 models.Book
    3. # from . import models
    4. # 方式二:直接导入模型类
    5. from .models import Book  
    6. # Register your models here.
    7. admin.site.register(Book)  # 在模型类Book注册到站点admin,admin站点就会提供模型类Book的管理页面
    复制代码
  • 启动服务,重新登录 admin 后台管理体系,观察界面

  • 点击Books链接,查看图书详情页



  • 这里显示的内容是 __str__ 方法封装的字符串,以是可以自定义修改显示的字段
    1.     def __str __ (self):
    2.         return f'书名:{self.title},价格:{self.price},出版社:{self.pub},零售价:{self.market_price}'
    复制代码

模型管理器类

理解与阐明

作用:为后台管理界面添加便于操作的新功能
阐明:后台管理器类须继承自 Django.contrib.admin 里的 ModelAdmin
使用方法



  • 在 <应用app>/admin.py 里定义模型管理器类

  • 绑定注册模型管理器和模型类

  • 案例

类属性阐明



  • **list_display:**去控制哪些字段会显示在admin后台管理的修改列表页面中
  • **list_display_links:**可以控制list_display中的字段是否应该链接到对象的”更改”页面
  • **list_filter:**设置激活admin修改列表页面右侧栏中的过滤器
  • **search_fields:**设置启用admin更改列表页面上的搜刮框
实验:绑定模型管理器类



  • 修改 bookstore 应用下的 admin.py 文件,添加模型管理器类
    1. from django.contrib import admin
    2. from .models import Book
    3. # 定义一个模型管理类
    4. class BookManager(admin.ModelAdmin):    # 后台管理器类须继承自Django.contrib.admin里的ModelAdmin类
    5.     # 列表页显示哪些字段的列
    6.     list_display = ["id", "title", "price", "market_price", "pub"]
    7.     # 控制 list_display 中的字段,哪些可以链接到修改页,缺省默认首列
    8.     list_display_links = ["title"]   # 点击书名,可以进入该条数据的修改页面
    9.     # list_display_links = ["title", "price"]   # 点击书名列或价格列,可以进入该条数据的修改页面
    10.     # 添加过滤器
    11.     list_filter = ["pub"]        # 以出版社列给出过滤项
    12.     # 添加搜索框[模糊查询]
    13.     search_fields = ["title"]    # 搜索框模糊匹配标题列
    14.     # search_fields = ["title", "pub"]  # 搜索框模糊匹配书名列或出版社列
    15.     # 添加可直接在列表编辑的字段(不必进入修改页面)
    16.     list_editable = ["price"]
    17. admin.site.register(Book, BookManager)  # 将模型管理器类和模型类进行绑定
    复制代码
  • 启动服务,重新登录 admin 后台管理体系,观察界面
  • 点击Books进入详情页,发现修改内容均已在管理界面见效

默认自带按字段排序功能
Meta类

在管理页面看见的模型类的名称,可以通过Meta内嵌类来修改。
通过Meta内嵌类定义模型类的属性,用法如下:

实验:修改Meta类属性



  • 修改 bookstore 应用下的 admin.py 文件,修改 Book 模型类
    1. from django.db import models
    2. class Book(models.Model):
    3.     title = models.CharField("书名", max_length=50, default="", unique=True)
    4.     pub = models.CharField("出版社", max_length=50, default="")
    5.     price = models.DecimalField("定价", max_digits=7, decimal_places=2, default=0.0)
    6.     market_price = models.DecimalField("零售价", max_digits=7, decimal_places=2, default=0.0)
    7.     is_active = models.BooleanField("是否活跃", default=True)
    8.     def __str__(self):
    9.         return f"{self.title}, {self.pub}, {self.price}, {self.market_price}"
    10.     class Meta:
    11.         db_table = "book"
    12.         verbose_name = "图书"  # 修改单数显示
    13.         verbose_name_plural = verbose_name  # 修改复数显示,缺省默认单数显示+s
    复制代码
  • 启动服务,重新登录 admin 后台管理体系,观察界面
练习

需求:对 Author 模型管理类的自定义设置


  • 将 Author 模型类加入后台管理
  • 制作一个 AuthorManager 管理器类,让后台管理 Authors 列表中显示作者的 ID、姓名、年龄信息
  • 用后台管理程序添加三条 Author 记载
  • 修改其中一条记载的年龄 – Author
  • 删除最后一条添加的记载 – Author
  1. 修改bookstore 应用下的 admin.py 文件
  2. from django.contrib import admin
  3. from .models import Book,Author
  4. # 定义一个模型管理类
  5. class BookManager(admin.ModelAdmin):    # 后台管理器类须继承自Django.contrib.admin里的ModelAdmin类
  6.     # 列表页显示哪些字段的列
  7.     list_display = ["id", "title", "price", "market_price", "pub"]
  8.     # 控制 list_display 中的字段,哪些可以链接到修改页,缺省默认首列
  9.     list_display_links = ["title"]   # 点击书名,可以进入该条数据的修改页面
  10.     # list_display_links = ["title", "price"]   # 点击书名列或价格列,可以进入该条数据的修改页面
  11.     # 添加过滤器
  12.     list_filter = ["pub"]        # 以出版社列给出过滤项
  13.     # 添加搜索框[模糊查询]
  14.     search_fields = ["title"]    # 搜索框模糊匹配标题列
  15.     # search_fields = ["title", "pub"]  # 搜索框模糊匹配书名列或出版社列
  16.     # 添加可直接在列表编辑的字段(不必进入修改页面)
  17.     list_editable = ["price"]
  18. class AuthorManager(admin.ModelAdmin):
  19.     list_display = ["id", "name", "age"]
  20.     list_display_links = ["name"]
  21. admin.site.register(Book, BookManager)  # 将模型管理器类和模型类进行绑定
  22. admin.site.register(Author, AuthorManager)  # 将模型管理器类和模型类进行绑定
复制代码
  1. 修改 bookstore 应用下的 admin.py 文件,修改 Author 模型类
  2. from django.db import models
  3. class Author(models.Model):
  4.     ...
  5.     class Meta:
  6.         db_table = "author"
  7.         verbose_name = "作者"  # 修改单数显示
  8.         verbose_name_plural = verbose_name  # 修改复数显示,缺省默认单数显示+s
复制代码
总结



  • 注册自己的模型类
  • 修改自定义模型类的显示样式 - 模型管理器类
  • Meta类对模型类的属性修改
用户管理




  • 权限

关系映射

什么是关系映射

在关系型数据库中,通常不会把所有数据都放在同一张表中,不易于扩展,常见关系映射有:


  • 一对一映射

    • 如:一个身份证对应一个人

  • 一对多映射

    • 如:一个班级可以有多个学生

  • 多对多映射


    • 如:一个学生可以报多个课程,一个课程可以有多个学生学习

一对一映射 models.OneToOneField()

概念与理解



  • 一对一是表示现实事物间存在的一对一的对应关系
  • 如:一个家庭只有一个户主,一个男人有一个妻子,一个人有一个唯一的指纹信息等
  • 语法:OneToOneField(类名, on_delete=xxx)

特殊字段选项【必须】

on_delete:级联删除



  • 几个可选的值:

    • models.CASCADE:级联删除,Django模仿 SQL 束缚 ON DELETE CASCADE 的行为,并删除包含 ForeignKey的对象。当主表数据被删除时,从表对应的数据也被删除。
    • Models.PROTECT:抛出 ProtectedError 以制止被引用对象的删除;等同于 mysql 默认的 RESTRICT。当主表数据被删除时,从表对应的数据不被删除。
    • SET_NULL:设置 ForeignKey null;需要指定 null = True。当主表数据被删除时,从表对应的数据设置为null。
    • SET_DEFAULT:将 ForeignKey 设置为其默认值,必须设置 ForeignKey 的默认值。当主表数据被删除时,从表对应的数据设置为相应的默认值。

创建模型类



  • 示例 - 创建模型类 – oto/models.py

添加数据



  • 无外键的模型类[Author]:

    • author1 = Author.objects.create(name=“王老师”)

  • 有外键的模型类[Wife]:

    • 方式1:wife1 = Wife.objects.create(name=“王夫人”, author=author1) # 关联王老师对象
    • 方式2:wife1 = Wife.objects.create(name=“王夫人”, author_id=1) # 关联王老师对应的主键值

查询数据

正向查询



  • 直接通过外键属性查询,则称为正向查询

反向查询

没有外键属性的一方,可以调用反向属性查询关联的另一方


  • 反向关联属性为:实例对象.引用类名(小写),如作家的反向引用为:作家对象.wife
  • 当反向引用不存在时,则会触发异常
    1. author1 = Author.objects.get(name=‘王老师’)
    2. author1.wife.name
    复制代码
实验:一对一模型



  • 创建应用:oto
    1. (testenv) [root@localhost mysite3]# python3 manage.py startapp oto
    复制代码
  • 并在 settings.py 中将 oto 应用举行注册
    1. INSTALLED_APPS = [
    2.     'django.contrib.admin',
    3.     'django.contrib.auth',
    4.     'django.contrib.contenttypes',
    5.     'django.contrib.sessions',
    6.     'django.contrib.messages',
    7.     'django.contrib.staticfiles',
    8.     'music',
    9.     'news',
    10.     'sport',
    11.     'bookstore',
    12.     'oto',  # 模型注册
    13. ]
    复制代码
  • 修改 oto 应用下的 models.py,创建模型类
    1. from django.db import models
    2. class Author(models.Model):
    3.     # wife 反向属性:用作反向查询
    4.     name = models.CharField('姓名', max_length=11)
    5. class Wife(models.Model):
    6.     name = models.CharField('姓名', max_length=11)
    7.     # 添加外键,指定关联的表
    8.     author = models.OneToOneField(Author, on_delete=models.CASCADE)
    复制代码
  • 同步迁移数据库
    1. (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    2. (testenv) [root@localhost mysite3]# python3 manage.py migrate
    复制代码
  • 进入 MySQL 环境,观察 wife 表中的外键,主动天生 author_id 外键
    1. (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    2. MariaDB [(none)]> USE mysite3;
    3. MariaDB [mysite3]> DESC oto_author;
    4. +-------+-------------+------+-----+---------+----------------+
    5. | Field | Type        | Null | Key | Default | Extra          |
    6. +-------+-------------+------+-----+---------+----------------+
    7. | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    8. | name  | varchar(11) | NO   |     | NULL    |                |
    9. +-------+-------------+------+-----+---------+----------------+
    10. MariaDB [mysite3]> DESC oto_wife;
    11. +-----------+-------------+------+-----+---------+----------------+
    12. | Field     | Type        | Null | Key | Default | Extra          |
    13. +-----------+-------------+------+-----+---------+----------------+
    14. | id        | int(11)     | NO   | PRI | NULL    | auto_increment |
    15. | name      | varchar(11) | NO   |     | NULL    |                |
    16. | author_id | int(11)     | NO   | UNI | NULL    |                | # 外键
    17. +-----------+-------------+------+-----+---------+----------------+
    复制代码
  • 测试:给两张表中添加数据,使用 Django Shell 的方式,两种方式添加数据
    1. (testenv) [root@localhost mysite3]# python3 manage.py shell
    2. >>> from oto.models import *
    3. >>> a1 = Author.objects.create(name="ben")
    4. >>> a1.name
    5.         'ben'
    6. >>> a1.id
    7.         1
    8. >>> w1 = Wife.objects.create(name="benfuren", author=a1)    # 方式一:指定对象赋值
    9. >>> w1 = Wife.objects.create(name="benfuren", author_id=1)  # 方式二:指定数据库字段(外键)赋值
    10. >>> a2 = Author.objects.create(name="niu")
    11. >>> a2.id  # 查看作者id
    12.         2
    13. >>> w2 = Wife.objects.create(name="niufuren", author_id=2)  # 数据库字段赋值
    复制代码
  • 查询:正向查询(带外键的表)
    1. (testenv) [root@localhost mysite3]# python3 manage.py shell
    2. >>> from oto.models import *
    3. >>> wife = Wife.objects.get(name="benfuren")
    4. >>> wife.name
    5. 'benfuren'
    6. >>> wife.author.name       # 正向查询
    7. 'ben'
    复制代码
  • 查询:反向查询(不带外键的表)
    1. (testenv) [root@localhost mysite3]# python3 manage.py shell
    2. >>> from oto.models import *
    3. >>> author1 = Author.objects.get(name="ben")
    4. >>> author1.wife.name       # 利用反向属性进行数据查询
    5. 'benfuren'
    复制代码
一对一映射关系总结



  • 一对一的模型类创建
  • 一对一的数据创建
  • 一对一的数据查询

    • 正向查询
    • 反向查询

一对多映射 models.ForeignKey()

概念与理解



  • 一对多是表示现实事物存在的一对多的对应关系
  • 如:一个学校有多个班级,一个班级有多个学生,一本书只能属于一个出版社,但是出版社可以出版多本书
  • 一对多需要明白出具体角色,在多表上设置外键
创建模型类



  • 语法:当一个A类对象可以关联多个B类对象时

  • ForeignKey必须指定 on_delete 模式
  • 示例 – 创建模型类 - otm/models.py

添加数据



  • 先创建“一”再创建多“多”
  • 示例:
    1. from .models import *
    2. pub1=Publisher.objects.create(name='清华大学出版社')
    3. Book.objects.create(title='C++', publisher=pub1)
    4. Book.objects.create(title='Java', publisher_id=1)
    复制代码
查询数据



  • 正向查询 [通过Book查询Publisher]

  • 反向查询 [通过Publisher查询对应的所有的Book] 需要用到 反向属性

实验:一对多模型



  • 创建应用:otm
    1. (testenv) [root@localhost mysite3]# python3 manage.py startapp otm
    复制代码
  • 并在 settings.py 中将 otm 应用举行注册
    1. INSTALLED_APPS = [
    2.     'django.contrib.admin',
    3.     'django.contrib.auth',
    4.     'django.contrib.contenttypes',
    5.     'django.contrib.sessions',
    6.     'django.contrib.messages',
    7.     'django.contrib.staticfiles',
    8.     'music',
    9.     'news',
    10.     'sport',
    11.     'bookstore',
    12.     'oto',
    13.     'otm',  # 模型注册
    14. ]
    复制代码
  • 修改 otm 应用下的 models.py,创建模型类
    1. from django.db import models
    2. class Publisher(models.Model):
    3.     #出版社  [一]
    4.     name = models.CharField('出版社名称', max_length=50)
    5. class Book(models.Model):
    6.     #书名 [多]
    7.     title = models.CharField('书名', max_length=11)
    8.     publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)  # 外键
    复制代码
  • 同步迁移数据库
    1. (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    2. (testenv) [root@localhost mysite3]# python3 manage.py migrate
    复制代码
  • 进入 MySQL 环境,观察 Book 表中的外键
    1. (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    2. MariaDB [(none)]> USE mysite3;
    3. MariaDB [mysite3]> DESC otm_publisher;
    4. +-------+-------------+------+-----+---------+----------------+
    5. | Field | Type        | Null | Key | Default | Extra          |
    6. +-------+-------------+------+-----+---------+----------------+
    7. | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    8. | name  | varchar(50) | NO   |     | NULL    |                |
    9. +-------+-------------+------+-----+---------+----------------+
    10. MariaDB [mysite3]> DESC otm_book;
    11. +--------------+-------------+------+-----+---------+----------------+
    12. | Field        | Type        | Null | Key | Default | Extra          |
    13. +--------------+-------------+------+-----+---------+----------------+
    14. | id           | int(11)     | NO   | PRI | NULL    | auto_increment |
    15. | title        | varchar(11) | NO   |     | NULL    |                |
    16. | publisher_id | int(11)     | NO   | MUL | NULL    |                | # 外键
    17. +--------------+-------------+------+-----+---------+----------------+
    18.                                      MUL 允许多条数据有相同的publisher_id
    复制代码
  • 测试:给两张表中添加数据,使用 Django Shell 的方式,先创建一,再创建多
    1. (testenv) [root@localhost mysite3]# python3 manage.py shell
    2. >>> from otm.models import *
    3. >>> p1 = Publisher.objects.create(name="中信出版社")
    4. >>> p1
    5. <Publisher: Publisher object (1)>
    6. >>> p1.name
    7.         '中信出版社'
    8. >>> p1.id
    9.         1
    10. >>> b1 = Book.objects.create(title="python1", publisher=p1)    # 类属性赋值
    11. >>> b2 = Book.objects.create(title="python2", publisher_id=1)  # 数据库字段赋值
    12. >>> b1.publisher_id
    13.         1
    14. >>> b2.publisher_id
    15.         1
    16. MariaDB [mysite3]> select * from otm_book;
    复制代码
  • 查询:正向查询
    1. (testenv) [root@localhost mysite3]# python3 manage.py shell
    2. >>> from otm.models import *
    3. >>> b1 = Book.objects.get(id=1)
    4. >>> b1
    5.         <Book: Book object (1)>
    6. >>> print(b1.title, b1.publisher.name)
    7.         python1 中信出版社
    复制代码
  • 查询:反向查询
    1. >>> from otm.models import *
    2. >>> pub1 = Publisher.objects.get(name="中信出版社")
    3. >>> pub1
    4.         <Publisher: Publisher object (1)>
    5. >>> books = pub1.book_set.all()
    6. >>> books
    7.         <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
    8. >>> for book in books:
    9. ...     print(book.title)
    10. ...
    11.         python1
    12.         python2
    13.    
    复制代码
多对多映射 models.ManyToManyField()

概念与理解



  • 多对多表达对象之间多对多的复杂关系,如:每个都有差异的学校(小学,初中,高中……),每个学校都有差异的学生……
  • Mysql 中创建多对多需要依赖第三张表来实现
  • Django 中无需手动创建第三张表,这个操作Django主动完成
  • 语法:在关联的两个类中的任意一个类中,增加:

    • 属性 = models.ManyToManyField(MyModel)

创建模型类

用法示例:


  • 一个作者可以出版多本图书
  • 一本图书可以由多个作者共同编写

  • 用法示例—创建模型类:

添加数据



  • 用法示例—创建数据

数据查询

**正向查询:**有多对多属性的对象查另一方


  • 通过 Book 查询对应的所有的 Author
  • 此时多对多属性相当于 objects

反向查询:


  • 通过 Author查询对应的所有的 Book
  • 使用反向属性 book_set

实验:多对多模型



  • 创建应用:mtm
    1. (testenv) [root@localhost mysite3]# python3 manage.py startapp otm
    复制代码
  • 并在 settings.py 中将 mtm 应用举行注册
    1. INSTALLED_APPS = [
    2.     'django.contrib.admin',
    3.     'django.contrib.auth',
    4.     'django.contrib.contenttypes',
    5.     'django.contrib.sessions',
    6.     'django.contrib.messages',
    7.     'django.contrib.staticfiles',
    8.     'music',
    9.     'news',
    10.     'sport',
    11.     'bookstore',
    12.     'oto',
    13.     'otm',
    14.     'mtm',  # 模型注册
    15. ]
    复制代码
  • 修改 mtm 应用下的 models.py,创建模型类
    1. from django.db import models
    2. class Author(models.Model):
    3.     name = models.CharField('姓名', max_length=11)
    4. class Book(models.Model):
    5.     title = models.CharField('书名', max_length=11)
    6.     authors = models.ManyToManyField(Author)
    复制代码
  • 同步迁移数据库
    1. (testenv) [root@localhost mysite3]# python3 manage.py makemigrations
    2. (testenv) [root@localhost mysite3]# python3 manage.py migrate
    复制代码
  • 进入 MySQL 环境,观察 Django 帮助我们天生的中间表
    1. (testenv) [root@localhost mysite3]# mysql -uroot -p123456
    2. MariaDB [(none)]> USE mysite3;
    3. MariaDB [mysite3]> DESC mtm_author;
    4. +-------+-------------+------+-----+---------+----------------+
    5. | Field | Type        | Null | Key | Default | Extra          |
    6. +-------+-------------+------+-----+---------+----------------+
    7. | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    8. | name  | varchar(11) | NO   |     | NULL    |                |
    9. +-------+-------------+------+-----+---------+----------------+
    10. MariaDB [mysite3]> DESC mtm_book;
    11. +-------+-------------+------+-----+---------+----------------+
    12. | Field | Type        | Null | Key | Default | Extra          |
    13. +-------+-------------+------+-----+---------+----------------+
    14. | id    | int(11)     | NO   | PRI | NULL    | auto_increment |
    15. | title | varchar(11) | NO   |     | NULL    |                |
    16. +-------+-------------+------+-----+---------+----------------+
    17. MariaDB [mysite3]> DESC mtm_book_authors;  # 中间表
    18. +-----------+---------+------+-----+---------+----------------+
    19. | Field     | Type    | Null | Key | Default | Extra          |
    20. +-----------+---------+------+-----+---------+----------------+
    21. | id        | int(11) | NO   | PRI | NULL    | auto_increment |
    22. | book_id   | int(11) | NO   | MUL | NULL    |                |
    23. | author_id | int(11) | NO   | MUL | NULL    |                |
    24. +-----------+---------+------+-----+---------+----------------+
    复制代码
  • 测试:给两张表中添加数据,使用 Django Shell 的方式
    1. (testenv) [root@localhost mysite3]# python3 manage.py shell
    2. >>> from mtm.models import *
    3. # 两个人写了一本书
    4. ## 方案1:先创建 author,再关联 book
    5. >>> author1 = Author.objects.create(name="teacher ben")
    6. >>> author2 = Author.objects.create(name="teacher niu")
    7. >>> book1 = author1.book_set.create(title="Python")
    8. >>> author2.book_set.add(book1)
    9. MariaDB [mysite3]> select * from mtm_book_authors;
    10. ## 方案2:先创建 book,再关联 author
    11. >>> book2 = Book.objects.create(title="Django")
    12. >>> author3 = book2.authors.create(name="teacher hu")
    13. >>> book2.authors.add(author2)
    14. # 一个人写了两本书
    15. >>> book3 = Book.objects.create(title="HH")
    16. >>> book4 = Book.objects.create(title="AA")
    17. >>> author4 = book3.authors.create(name="teacher xie")
    18. >>> book4.authors.add(author4)
    复制代码
  • 查询:正向查询,通过 Book 查询对应的所有的 Author
    1. (testenv) [root@localhost mysite3]# python3 manage.py shell
    2. >>> from mtm.models import *
    3. >>> book1 = Book.objects.get(title="Django")
    4. >>> book1.title
    5.         'Django'
    6. >>> users = book1.authors.all()
    7. >>> for user in users:
    8. ...     print(user.name)
    9. ...
    10.     teacher niu
    11.     teacher hu
    复制代码
  • 查询:反向查询
    1. (testenv) [root@localhost mysite3]# python3 manage.py shell
    2. >>> from mtm.models import *
    3. >>> author2 = Author.objects.get(name="teacher niu")
    4. >>> books = author2.book_set.all()
    5. >>> for book in books:
    6. ...     print(book.title)
    7. ...
    8.     Python
    9.     Django
    复制代码
Cookies 和 Session

会话概念



  • 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话
  • HTTP 协议是无状态的,导致会话状态难以保持
  • 试想一下,如果不保持会话状态,再电商网站购物的场景体验?
  • Cookies和Session就是为了保持会话状态而诞生的两个存储技术
Cookies

Cookies 定义

cookies 是保存在客户端浏览器上的存储空间
Cookie 使用场景

在讲cookie前先了解下它的使用场景


  • 使用Chrome浏览器打开京东网站且未登录情况下我的购物车未添加商品,以是商品数目是0

  • 挑选3个商品加入购物车,此时购物车数目显示3

  • 关闭 Chrome 浏览器再次打开京东首页发现购物车数目还是 3
  • 如果此时换成 Firefox 浏览器打开京东首页发现购物车里的商品数目是 0
  • 为什么 Chrome 浏览器未登录关闭浏览器后再次打开购物车商品数目没变,换个浏览器购物车商品数目就不是 3 了,这个场景就阐明白 2 点


    • 商品信息保存在当地了,未保存在浏览器缓存
    • 差异的浏览器cookie的保存路径不一样,并且各个浏览器的cookie信息互不影响

Cookies 特点



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




实验:Cookies 操作



  • 添加 cookies:修改 mysite3 下的 views.py 文件,添加指定视图函数
    1. from django.shortcuts import render
    2. from django.http import HttpResponse
    3. def test_static(request):
    4.     return render(request, "test_static.html")
    5. def set_cookies(request):  # 添加测试cookie的函数
    6.     resp = HttpResponse('set cookies is ok')
    7.     resp.set_cookie('uuname', 'nfx' , 500)  # cookie的key为'uuname',value为'nfx',过期时间500s
    8.     return resp
    复制代码
  • 修改主路由 urls.py
    1. from django.contrib import admin
    2. from django.urls import path, include
    3. from . import views
    4. urlpatterns = [
    5.     path('admin/', admin.site.urls),
    6.         ......
    7.     path('set_cookies', views.set_cookies),
    8. ]
    复制代码
  • 启动服务,测试 http://127.0.0.1:8000/set_cookies,观察网络请求中的 cookies 变革
    1. 网页返回
    2. set cookies is ok
    3. F12查看'网络',点击set_cookies,可以看到消息头中的响应头的Set-Cookies
    4. 查看'存储',Cookie中可以看到键值对 uuname: nfx
    复制代码

  • 获取 cookies:修改 mysite3 下的 views.py 文件,添加指定视图函数
    1. from django.shortcuts import render
    2. from django.http import HttpResponse
    3. def test_static(request):
    4.     return render(request, "test_static.html")
    5. def set_cookies(request):
    6.     resp = HttpResponse('set cookies is ok')
    7.     resp.set_cookie('uuname', 'nfx',500)
    8.     return resp
    9. def get_cookies(request):  # 添加获取cookie的函数
    10.     value = request.COOKIES.get('uuname')
    11.     return HttpResponse(f'value is {value}')  # 如果cookies过期了,则值为None
    复制代码
  • 修改主路由 urls.py
    1. from django.contrib import admin
    2. from django.urls import path, include
    3. from . import views
    4. urlpatterns = [
    5.     path('admin/', admin.site.urls),
    6.     # ......
    7.     path('set_cookies', views.set_cookies),
    8.     path('get_cookies', views.get_cookies),  # 获取cookie的url
    9. ]
    复制代码
  • 启动服务,测试 http://127.0.0.1:8000/get_cookies,观察网络请求中的 cookies 变革

Session

Session概念

session 是在服务器上开辟了一段用于保存浏览器和服务器交互时的紧张数据
实现方式



  • 使用session需要在浏览器客户端启动 cookie,且在cookie中存储 sessionid
  • 每个客户端都可以在服务端有一个独立的 session
  • 注意:差异的请求者之间不会共享这个数据,与请求者逐一对应

在 Django 中的配置



  • settings.py
向 INSTALLED_APPS 列表中添加

向 MIDDLEWARE 列表中添加

session的使用



  • session 对象是一个雷同与字典的 SessionStore 类型的对象,可以用类拟于字典的方式举行操作
  • session 能够存储如字符串,整型,字典,列表等数据
  • 保存 session 的值到服务器

    • request.session[‘KEY’] = VALUE

  • 获取 session 的值

    • value = request.session[‘KEY’]
    • value = request.session.get(‘KEY’, ‘默认值’)

  • 删除 session

    • del request.session[‘KEY’]

实验:Session 操作



  • 添加以及获取 session:修改 mysite3 下的 views.py 文件,添加指定视图函数
    1. def set_session(request):
    2.     request.session['uname'] = 'nfx'
    3.     return HttpResponse('set session is ok')
    4. def get_session(request):
    5.     value = request.session['uname']
    6.     return HttpResponse(f'session value is {value}')
    复制代码
  • 修改主路由 urls.py
    1. from django.contrib import admin
    2. from django.urls import path, include
    3. from . import views
    4. urlpatterns = [
    5.     path('admin/', admin.site.urls),
    6.     ......
    7.     path('set_cookies', views.set_cookies),
    8.     path('get_cookies', views.get_cookies),
    9.    
    10.     path('set_session', views.set_session),  # 设置session
    11.     path('get_session', views.get_session),  # 获取session
    12. ]
    复制代码
  • 启动服务:先测试 set 设置 session,然后再测试 get 获取 session

  1. select * from django_session;
  2. 执行 `del request.session['KEY']` 删除session,但只是让数据过期失效,实际上数据库里的数据没有被删除
  3. django_session 表是单表设计;且该表数据量持续增加
  4. - 可以定期执行 **python3 manage.py clearsessions**
  5. - 该命令可删除已过期的 session 数据
复制代码
settings.py 中相关配置项以及注意事项



  • SESSION_COOKIE_AGE

    • 作用:指定sessionid在cookies中的保存时长 (默认2周),如下:
    • 比方:SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2

  • SESSION_EXPIRE_AT_BROWSER_CLOSE = True

    • 设置只要浏览器关闭时,session就失效(默认False)

  • 注意:Django中的session数据存储在数据库中,以是使用session前需要确保已经执行过migrate操作将存储session表创建出来
  • django_session 表是单表设计;且该表数据量连续增加

    • 可以定期执行 python3 manage.py clearsessions
    • 该下令可删除已逾期的 session 数据

Cookie和Session的对比



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表