• python+Django框架运用(四)


    Django后台管理

    基本配置

    默认登录地址:http://127.0.0.1:8000/admin

    创建后台管理员:

      python3  ./manage.py  createsuperuser    # 回车后输入以下内容

      Username:输入用户名

      Email Address:电子邮箱

      Password:密码
      Password(again):重复密码

    基本管理

    1、在应用中的admin.py中注册要管理的实体类(models.py中的类)

    from django.contrib import admin
    from .models import *
    
    # 注册CartInfo和Order两个实体类
    admin.site.register(CartInfo)
    admin.site.register(Order)

    2、修改models.py,来改变后台内容的显示

      1). models.py中为各个类(实体类)追加一个方法。

    def __str__(self):
        return self.属性名

      2). 通过Models类的内部类Meta定义每个类的展现形式

    class Author(models.Model):
      ... ...# 定义对象在后台的展现形式
        def __str__(self):
            return self.names
    
        # 声明内部类,定义当前类在管理页面中的展现形式
        class Meta:
            # 1.修改当前表名为author(需要同步到数据库)
            db_table = 'author'
    
            # 下面两个只与后台有关系
            # 2.修改实体类在后台管理页中的名称(单数)
            verbose_name = '作者'
            # 3.修改实体类在后台管理页中的名称(复数)
            verbose_name_plural = verbose_name
    
            # 4.先按照年龄降序排序,再按照ID升序排序
            ordering = ['-age', 'id']

    高级管理

    1、在admin.py中创建高级管理类并注册

    # 定义Author高级管理类
    # 类名:实体类名+Admin,必须继承admin.ModelAdmin
    class AuthorAdmin(admin.ModelAdmin):
        pass
    
    
    # 注册高级管理类
    admin.site.register(Author, AuthorAdmin)

    2、定制高级管理信息

    # 定义Author高级管理类
    class AuthorAdmin(admin.ModelAdmin):
        #  list_display:指定在列表页中能够显示的字段
        #  取值:由属性名称组成的元组或列表
        list_display = ['names', 'age', 'email']
    
        #  list_display_links:定义列表页中能链接到详情页的字段
        #  取值:由属性名称组成的元组或列表(必须存在与list_display中)
        list_display_links = ['names', 'email']
    
        # list_editable:指定在列表页中允许被编辑的字段
        # 取值:由属性名称组成的元组或列表
        # 不能出现在list_display_links, 但是必须在list_display中
        list_editable = ['age']
    
        # search_fields:添加允许被搜索的字段
        # 取值:由属性名称组成的元组或列表
        search_fields = ['names', 'email']
    
        # list_filter:在列表的右侧增加过滤器,实现快速筛选
        list_filter = ['names', 'email']
    
        # fields:指定详情页显示的字段以及排列的顺序
        # 取值:由属性名称组成的元组或列表
        fields = ['email', 'names', 'age', 'isActive']
        
        # date_hierarchy:在列表页的顶端增加一个时间选择器
        # 取值必须是DateField或DateTimeField的值
        date_hierarchy = 'publicate'
    
        # fieldsets:在详情页中,对字段进行分组显示(不能同时与fields存在)
        fieldsets = [
            # 分组1
            (
                '基本信息', {
                    'fields': ('names', 'email')
                }
            ),
            # 分组2
            (
                '可选信息', {
                    'fields': ('age', 'isActive'),
                    'classes': ('collapse',),
                }
            )
        ]

    关系映射

    一对一映射

      一对一表示,A表中的一条记录只能与B表中的一条记录相关联。

      数据库中实现方式:

        A表:设置主键  

        B表:增加一列(字段),并引用自A表的主键,并且得增加唯一约束

      1、在Django中的实现方式:

        在要相关联的两个实体类中的任意一个中增加:

        属性(字段)名 =  models.OneToOneField(要关联的实体类名)

      2、关联查询

    # 在Wife类中新增一个字段一对一关联Author类
    class Wife(models.Model):
        ... 
        author=models.OneToOneField(Author)
    # 正向查询:通过wife 找 author
    # 1.获取 id 为1 的 Wife的信息
    wife = Wife.objects.get(id=1)
    # 2.通过 Wife 的关联属性 author 来找Author
    author = wife.author
    
    
    
    # 反向查询:通过author 找 wife
    # 1.获取 id 为14 的 Author的信息
    author = Author.objects.get(id=14)
    # 2.通过 author 的关联属性 wife 来找wife
    # wife是Django通过OneToOneField在Author(被关联表)中默认增加的一个隐式属性 wife = author.wife

    一对多映射

      一对多表示,A表中的一条记录能与B表中的多条记录相关联。反之,B表中的一条记录只能与B表中的一条记录相关联。

      数据库中实现方式:

        通过外键来实现一对多,在‘’表中增加外键对‘’表的主键进行引用

      1、在Django中的实现:

        在“多”的实体类中增加:

        属性(字段)名 = models.ForeignKey("一"的实体类名)

      2、关联查询

    # Book(多) 和 Publisher(一)
    class Book(models.Model):
        ... ...
        publisher=models.ForeignKey(Publisher)
    # 正向查询 - 通过Book查询Publisher    
    # 查询id为1的书籍的信息
    book = Book.objects.get(id=1)
    # 查询关联的publisher
    publisher = book.publisher
        
            
    
    # 反向查询 - 通过Publisher查询Book
    # Django会在 “一” 的实体中增加关联对象_set 属性,用于查询“多”的数据
    # 结合 Publisher 和 Book 之间关系 :在 Publisher 中 增加了一个 book_set 属性
    publisher=Publisher.objects.get(id=1)
    books = publisher.book_set.all()

    多对多关联

      多对多表示,A表中的一条记录能与B表中的多条记录相关联。反之,B表中的一条记录同样能与B表中的多条记录相关联。

      在数据库中的实现方式:

        必选创建第三张表,关联两张多对多的数据表

      1、在Django中实现方式:

        在任意一个要实现多对多关联的实体类中增加:

        属性(字段)名 = models.ManyToManyField(关联的实体类名)

      2、关联查询

    # 实体类Author 与 Book多对多关联
    class Author(models.Model):
        ... ...
        book = models.ManyToManyField(Book)
    # 正向查询-通过Author查询所有的Book
    author = Author.objects.get(id=1)
    # 通过 关联属性.all() 查询所有对应数据
    books = author.book.all()
    
    
    
    # 反向查询-通过Book查询所有的Author
    # Django中 会在Book(被关联) 实体中增加一个隐式属性author_set
    book = Book.objects.get(id=1)
    authors = book.author_set.all()

    对于关联映射的总结:

      三种关联关系的查询中,都存在正向和反向两种查询方式

      正向查询都是直接用增加的关联属性进行查询就可以

      反向查询在Django中都会增加一个隐式属性,分别是:

        一对一:关联的实体类名(小写)

        一对多:在“一”的实体增加关联属性“_set”属性,用于查询"多"的数据

        多对多:与一对多类似。

    未完待续......

  • 相关阅读:
    C# 使用FileSystemWatcher类来对一个日志文件的变化进行实时监测
    C# 高效提取txt文档最后一行数据
    C# 高效提取txt文档最后一行数据
    Bat 批处理之 for/f 详解
    Bat 批处理之 for/f 详解
    windows bat命令 如何获取文件最后一行
    windows bat命令 如何获取文件最后一行
    C#读取文件或者字符流的最后几行,类似linux的tail命令OK
    C#读取文件或者字符流的最后几行,类似linux的tail命令OK
    C#开源文件实时监控工具Tail&TailUI
  • 原文地址:https://www.cnblogs.com/hxgoto/p/9364879.html
Copyright © 2020-2023  润新知