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”属性,用于查询"多"的数据

    多对多:与一对多类似。

 

未完待续......

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/hxgoto/p/9364879.html

jQuery常用操作-编程思维

jQuery   jQuery是一个轻量级的JS库,是一个被封装好的JS文件,提供了更为简便的元素操作方式,jQuery封装了DOM。   使用jQuery 引入jQuery文件   <scrtipt src='jquery-1.11.3.js'> </script>   注意:引入必须放在其他

python+Django框架运用(三)-编程思维

Django模型 模式指的是根据数据库中数据表的结构来创建出来的class,每一张表到Python中就是一个 class,表中的每一个列,到Python中就是class的一个属性。 在模型中可以完成对数据库的增删改查操作 创建和使用模型 --ORM(对象关系映射) 三大特征:   1、数据表到类的映射     将数据表

python+Django框架运用(一)-编程思维

Django 介绍:   django是一个采用Python语言开发的开源框架,2005年发布。早期是做新闻以及内容管理的网站的,提供了非常强大的后管理系统。   django官网:https://www.djangoproject.com   框架模式:     djando的框架模式 - MTV:       M

python 的math模块-编程思维

数学模块用法:import math# 或 from math import * 变量 描述 math.e 自然对数的底e math.pi 圆周率pi   函数名 描述 math.ceil(x) 对x向上取整,比如x=1.2,返回2 math.floor(x) 对x向下取整,比如x=1.2,返回1

jQuery常用操作-编程思维

jQuery   jQuery是一个轻量级的JS库,是一个被封装好的JS文件,提供了更为简便的元素操作方式,jQuery封装了DOM。   使用jQuery 引入jQuery文件   <scrtipt src='jquery-1.11.3.js'> </script>   注意:引入必须放在其他

聊一聊过滤器与拦截器-编程思维

过滤器 Filter 面试官:用过过滤器吧,介绍一下过滤器。 John同学(心中窃喜):用过,我经常用它来净化水 😁... 面试官:今天的面试到此结束,回去等通知吧。 John同学:🙃... Filter 基本介绍 过滤器 Filter 是 Sun 公司在 Servlet 2.3 规范中添加的新功能,其作用是对客户

python+Django框架运用(三)-编程思维

Django模型 模式指的是根据数据库中数据表的结构来创建出来的class,每一张表到Python中就是一个 class,表中的每一个列,到Python中就是class的一个属性。 在模型中可以完成对数据库的增删改查操作 创建和使用模型 --ORM(对象关系映射) 三大特征:   1、数据表到类的映射     将数据表

python+Django框架运用(一)-编程思维

Django 介绍:   django是一个采用Python语言开发的开源框架,2005年发布。早期是做新闻以及内容管理的网站的,提供了非常强大的后管理系统。   django官网:https://www.djangoproject.com   框架模式:     djando的框架模式 - MTV:       M

有了这10个GitHub仓库,开发者如同buff加持-编程思维

摘要:列出了10个极好的仓库,它们为所有web和软件开发人员提供了巨大的价值。 本文分享自华为云社区《所有开发者都应该知道的10个GitHub仓库》,作者: Ocean2022 。 除了作为互联网上一些最有趣的开源项目的主页,GitHub也是一个分享各种资源的好地方,从免费书籍到公共的api,从技术路线图到项目想法和项