Skr-Eric的Django课堂(五)——Django的Models和关系映射

使用后台管理 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的编程课堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值