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管理显示的是英文变成中文
在这里插入图片描述

在这里插入图片描述

  • 在浏览器端测试:

在这里插入图片描述

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]

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值