Djiango----图书人物管理系统(二)
1 创建数据库模型
ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。 这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。
一对多关系:外键写在多的一端
(1)编辑文件:bookApp/models.py
from django.db import models
# Create your models here.
from django.db import models
#
# Create your models here.
# 类对应数据库表, 表名称默认为bookApp_book.
class Book(models.Model):
# 属性对应数据库表的列名,默认会添加id这一列。
name=models.CharField(max_length=40,verbose_name='书籍名称')
pub_date=models.DateField(verbose_name='出版时间')
# 类对应数据库表, 表名称默认为bookApp_hero.
class Hero(models.Model):
# 属性对应数据库表的列名,默认会添加id这一列。
gender_chocie =[
(1,"男"),
(2,'女')
]
name=models.CharField(max_length=20,verbose_name='人物名称')
# 性别只能选择男(1)或者女(2)
gender=models.IntegerField(choices=gender_chocie,verbose_name='性别')
content=models.TextField(max_length=1000,verbose_name='任务描述')
# 外键关联, 如果删除书籍时,相关hero对应的书籍设置为空。
book_id =models.ForeignKey(Book,on_delete=models.SET_NULL,verbose_name='书籍ID',null=True)
2 生成数据库表
(1)激活模型:编辑 settings.py 文件,将应用加入到 INSTALLED_APPS 中
(2)生成迁移文件:根据模型类生成 sql 语句
python manage.py makemigrations
- 执行迁移:执行 sql 语句生成数据表
python manage.py migrate
3 数据库模型基本操作
(1)进入交互式的Python shell,并使用 Django 提供的免费 API
python manage.py shell
## 引入需要的包
In [1]: from bookApp.models import Book,Hreo
## 查看图书信息
In [2]: Book.objects.all()
Out[2]: <QuerySet []>
In [3]: from datetime import date
## 查看 Hreo信息
In [4]: Hreo.objects.all()
Out[4]: <QuerySet []>
## 新建图书信息
In [5]: b1=Book()
In [6]: b1.name='西游记'
In [7]: from datetime import date
In [8]: d1=date(2000,3,2)
In [9]: b1.pub_date=d1
In [10]: Book.objects.all()
Out[10]: <QuerySet []>
In [11]: b1.save()
## 查看图书信息
In [12]: Book.objects.all()
Out[12]: <QuerySet [<Book: Book object (1)>]> ## 返回的信息不直接,可以添加魔术方法
In [13]:
Do you really want to exit ([y]/n)? y
- 添加魔法方法,字符串的友好展示
(venv) C:\Users\kang~\PycharmProjects\djangoProject1>python manage.py shell
Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.21.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from bookApp.models import Book,Hreo
## 新建图书信息的第二种方法
In [2]: Book.objects.all()
Out[2]: <QuerySet [<Book: 西游记>]>
In [3]: from datetime import date
```bash
In [2]: from bookApp.models import Book, Hreo
In [3]: Book.objects.all()
Out[3]: <QuerySet [<Book: 西游记>, <Book: 红楼梦>]>
In [4]: b2=Book(name='红楼梦',pub_date=date(1834,3,4))
In [5]: b2.save()
In [6]: Book.objects.all()
Out[6]: <QuerySet [<Book: 西游记>, <Book: 红楼梦>]>
## 根据条件搜索查看
In [3]: from bookApp.models import Book, Hreo
In [4]: Book.objects.filter(name="红楼梦") ## 查看name=红楼梦的书,返回的是QuerySet
Out[4]: <QuerySet [<Book: 红楼梦>]>
In [5]: b1=Book.objects.filter(name="红楼梦").first() ## 返回的是Book实例化的对象
In [6]: b1
Out[6]: <Book: 红楼梦>
In [7]: b1.pub_date
Out[7]: datetime.date(1834, 3, 4)
## 删除
In [8]: b1.delete()
Out[8]: (1, {'bookApp.Book': 1})
In [9]: Book.objects.all()
Out[9]: <QuerySet [<Book: 西游记>]>
(2) 添加关联对象
# 书籍的创建
In [1]: from bookApp.models import Book,Hero
In [2]: from datetime import date
In [3]: b1=Book(name="倚天屠龙记",pub_date=date(1993,12,4))
In [4]: b1.save()
# 人物的创建
In [5]: hero1=Hero(name="周芷若",gender=False,content="周芷若的信息...")
In [6]: hero1.save()
## 外键的关联
In [7]: hero1.book_id=b1 ## 人物和书籍信息关联
In [8]: hero1.book_id
Out[8]: <Book: 倚天屠龙记>
In [9]: hero1.save()
In [10]: hero1.book_id
Out[10]: <Book: 倚天屠龙记>
## 英雄所在书籍的id
In [11]: hero1.book_id_id
Out[11]: 5
# 获得关联集合:返回当前b1对象的所有hero
In [12]: b1.hero_set.all()
Out[12]: <QuerySet [<Hero: 周芷若>]>
查询操作参考网址:
https://docs.djangoproject.com/en/3.1/ref/models/querysets/
## 查询今天之前出版的图书
In [25]: books=Book.objects.filter(pub_date__lt=date.today())
In [26]: books
Out[26]: <QuerySet [<Book: 西游记>, <Book: 倚天屠龙记>]>
## 书名中不包含“传”的书籍
In [27]: books=Book.objects.exclude(name__contains="传")
## 书名中包含“天”的书籍
In [28]: books
Out[28]: <QuerySet [<Book: 西游记>, <Book: 倚天屠龙记>]>
## 查找书名包含天的书
In [29]: books=Book.objects.exclude(name__contains="天")
In [30]: books
Out[30]: <QuerySet [<Book: 西游记>]>
4 自定义模型加入后台管理
(1)编辑bookApp/admin.py 文件,注册模型
- 在浏览器端查看
(2)后台管理时, 将Book和Hero管理显示的是英文变成中文
- 使用Meta模型实现:https://docs.djangoproject.com/en/3.1/ref/models/options/
- 编辑bookApp/models.py 文件:
- 在浏览器端测试:
5 自定义管理页面
Django 提供了 admin.ModelAdmin 类,通过定义 ModelAdmin 的子类,来定义模型在 Admin 界面的显示方式
(1)编辑bookApp/admin.py,
from django.contrib import admin
# Register your models here.
from bookApp.models import Book,Hero
class BookAdmin(admin.ModelAdmin):
## 人物自定义管理页面,显示书籍的id,name,和出版日期
list_display = ['id','name','pub_date']
## 关联注册
admin.site.register(Book,BookAdmin)
admin.site.register(Hero)
(2)根据出版日期过滤书籍
(3)根据书名搜索
(4)每页显示四条书籍信息
(5)将书名作为链接
(5)修改英雄管理的必填信息和选填信息
(2)添加人物信息时,可同时添加两条
class HeroInline(admin.TabularInline):
model = Hero
extra = 2
class BookAdmin(admin.ModelAdmin):
list_display = ['id','name','pub_date']
list_filter = ['pub_date']
search_fields = ['name']
list_display_links = ['name']
list_per_page = 4
inlines = [HeroInline]