使用后台管理 Models
1.后台的配置
登录地址 :http://localhost:8000/admin
创建后台管理员(超级用户):
./manage.py createsuperuser
Username : 输入用户名,默认为系统账户名
Email Address : 电子邮件
Password : 密码
Password(again) : 确认密码
2.Models 的基本管理
1.在应用中的 admin.py 中注册要管理的实体类
1.admin.py
作用:注册要管理的Models类,只有注册后才能管理
from .models import *
admin.site.register(Entry)
2.注册Models
2.修改Models提升可读性
1.重写每个实体类中的 __str__()
后台显示的将以 __str__ 的返回值为准
2.为实体类中的属性们增加字段选项 - verbose_name
用于修改显示的字段名
3.通过Models类的内部类Meta定义其展现形式
class Author(models.Model):
... ...
class Meta:
1.db_table
指定该实体类映射到的表的名称
(该属性设置完成后需要同步回数据库)
2.verbose_name
定义类在 admin 中显示的名字(单数)
3.verbose_name_plural
定义类在 admin 中显示的名字(复数)
4.ordering
指定数据在后台管理中显示的排序方式
取值为一个列表,指定排序列,默认升序,降序使用-
3.Models 的高级管理
1.在 admin.py 中创建高级管理类并注册
1.定义 EntryAdmin 类 ,继承自 admin.ModelAdmin
class AuthorAdmin(admin.ModelAdmin):
pass
2.注册高级管理类
admin.site.register(Entry,EntryAdmin)
ex:
admin.site.register(Author,AuthorAdmin)
2.允许在 EntryAdmin 中增加的属性
1.list_display
作用:定义在列表页上显示的字段们
取值:由属性名组成的元组或列表
2.list_display_links
作用:定义在列表页上也能够链接到详情页的字段们
取值:同上
注意:取值必须要出现在list_display中
3.list_editable
作用:定义在列表页上就能够修改的字段们
取值:同上
注意:取值必须要出现在list_display中但不能出现在list_display_links中
4.search_fields
作用:定义搜索栏中允许搜索的字段值们
取值:同上
5.list_filter
作用:列表页的右侧在增加过滤器实现快速筛选
取值:同上
6.date_hierarchy
作用:列表页的顶部增加一个时间选择器,
取值:属性必须是 DateField 或 DateTimeField 的列
7.fields
作用:在详情页面中,指定要显示哪些字段并按照什么样的顺序显示
取值:由属性名组成的元组或列表
8.fieldsets
作用:在详情页面中对字段们进行分组显示
注意:fieldset 与 fields 不能共存
取值:
fieldsets = (
#分组1
('分组名称',{
'fields':('属性1','属性2'),
'classes':('collapse',)
}),
#分组2
()
)
关系映射
1.一对一映射
1.语法
在关联的两个类中的任何一个类都可以增加对另一个类的引用
属性 = models.OneToOneField(Entry)
ex:
class Author(models.Model):
.... ....
class Wife(models.Model):
.... ....
#增加对Author的一对一引用
author = models.OneToOneField(Author)
在数据库中:
会生成一个外键(author_id)列在 wife 表中,会引用在 author 表的主键
在 Author 中:
增加一个隐式属性 - wife,来表示author所对应的wife(其实就是反向引用属性)
2.查询
1.正向查询 :通过 Wife 找 Author
特点:通过自定义的关联属性查找对应实体
wife = Wife.objects.get(id=1)
author = wife.author
2.反向查询 :通过 Author 找 Wife
特点:通过反向引用属性查找对应的实体
author = Author.objects.get(id=1)
wife = author.wife
2.一对多映射
1.语法
在"多"表中增加对"一"表的外键引用
在"多"实体中增加对"一"实体的引用
在 "多" 实体中增加:
属性 = models.ForeignKey(Entry)
ex: Book(多) 和 Publisher(一)
class Book(models.Model)
... ...
publisher = models.ForeignKey(Publisher)
数据库中体现:
Book 表中 增加一个外键列 publisher_id ,引用自 Publisher 表中的主键
在实体类中的:
1.Book 中会有一个 publisher 属性 来表示对应的 Publisher 的对象
2.Publisher 中会有一个隐式属性 - book_set,用来表示该 publisher 对应的所有的 Book 对象的查询
3.多对多映射
1.语法
在关联的两个类的任意一个类中,增加:
属性 = models.ManyToManyField(Entry)
ex: Author 与 Book 可以是多对多关联关系
1位Author可以出版多本Book
1本Book可以由多位Author联合编写
class Author(models.Model)
.... ....
class Book(models.Model):
... ...
authors = models.ManyToManyField(Author)
正向引用:
在 Book 中通过 authors 来表示对应的所有的书籍的查询
反向引用:
在 Author 中通过 book_set 来表示对应的所有的作者们的查询
查询:通过 Book 查询 Author 以及 Author 查询 Book
class Author(models.Model)
.... ....
class Book(models.Model):
... ...
authors = models.ManyToManyField(Author)
正向查询:通过 Book 查询 Author
authors = book.authors.all()
反向查询:通过 Author查询Book
books = author.book_set.all()
2.自定义查询对象 - objects
Author.objects.all()
Author.objects.filter()
Author.objects.authors_count()
objects 属性的类型为 models.Manager
1.声明 EntryManager 类,继承自 models.Manager
允许在 EntryManager中增加自定义函数
class EntryManager(models.Manager):
def 函数名(self,自定义参数):
.... ....
return ...
2.使用EntryManager对象覆盖Models类中原有的objects
class Entry(models.Model):
objects = EntryManager()
想要看更多的课程请微信关注SkrEric的编程课堂