0x00 模型

  • 当前项目的开发, 都是数据驱动的。

  • 使用Django进行数据库开发的提示 :

    • MVT设计模式中的Model, 专门负责和数据库交互.对应(models.py)
    • 由于Model中内嵌了ORM框架, 所以不需要直接面向数据库编程.
    • 而是定义模型类, 通过模型类和对象完成数据库表的增删改查.
    • ORM框架就是把数据库表的行与相应的对象建立关联, 互相转换.使得数据库的操作面向对象.
  • 使用Django进行数据库开发的步骤 :

    1. 定义模型类
    2. 模型迁移
    3. 操作数据库

1、定义模型类

在这之前需要先设计数据库的表什么的,这里就不详细的说了(主要是我太懒了,手动狗头),感兴趣的可以看本文的参考链接,下面直接贴定义模型类的代码.

1
2
3
4
5
6
7
8
9
10
# BookManager/Book/models.py
from django.db import models

class BookInfo(models.Model): # 定义数据信息类模型
name = models.CharField(max_length=10) # 设计name属性

class PeopleInfo(models.Model): # 定义人物信息类模型
name = models.CharField(max_length=10)
gender = models.BooleanField()
book = models.ForeignKey(BookInfo)

2、模型迁移

由两步完成,首先生成迁移文件,根据模型类生成创建表的语句;接下来执行迁移,根据第一步生成的语句在数据库中创建表。分别由以下两句完成。

1
2
python3 manage.py makemigrations
python3 manage.py migrate

运行结果:

1
2
3
4
5
6
BookManager/ > python3 manage.py makemigrations
Traceback (most recent call last):
File "manage.py", line 21, in <module>
main()
………内容太多,此处省略………
TypeError: __init__() missing 1 required positional argument: 'on_delete'

在运行第一个命令的时候报错了,此时只需要修改定义外键的那行代码即可。

1
2
3
4
# 原来的
book = models.ForeignKey(BookInfo)
#修改后
book = models.ForeignKey(BookInfo,on_delete=models.CASCADE)

发生这个错误的原因是由于我看的教程使用的是1.8版本的Django,而我安装的是3.0,Django在2.0版本后,如果定义外键就需要加上on_delete选项了,OK,接下来,继续运行这两个代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
BookManager/ > python3 manage.py makemigrations
Migrations for 'Book':
Book\migrations\0001_initial.py
- Create model BookInfo
- Create model PeopleInfo

BookManager/ > python3 manage.py migrate
Operations to perform:
Apply all migrations: Book, admin, auth, contenttypes, sessions
Running migrations:
Applying Book.0001_initial... OK
………内容太多,此处省略………
Applying sessions.0001_initial... OK

到此,将主目录下生成的db.sqlite3文件拖拽到Database窗口中即可,如果没有Database的窗口,可以用Pycharm专业版试试。

0x01 站点管理

  • 站点分为内容发布和公共访问两部分。
  • 使用django站点管理模块步骤:
    • 管理界面本地化
    • 创建管理员
    • 注册模型类
    • 自定义站点管理界面

1、管理界面本地化

将语言,时间设置为本地的语言时间,大陆使用的简体中文,时区使用亚洲/上海时区,修改settings.py文件。

ps:为什么是上海时区,而不是北京时区?可能老外感觉上海才是国际大都市,北京只是二三线城市,毕竟老外对中国的印象都是陆家嘴而不是天安门(道听途说,不要当真,嘿嘿)

1
2
3
# BookManager/BookManager/settings.py
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

2、创建管理员

1
python3 manage.py createsuperuser

运行命令

1
2
3
4
5
6
BookManager/ > python3 manage.py createsuperuser
用户名 (leave blank to use 'dora'): test
电子邮件地址: test@test.com
Password:
Password (again):
Superuser created successfully.

运行服务

1
2
3
4
5
6
7
8
BookManager/ > python3 manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
February 29, 2020 - 20:52:43
Django version 3.0.3, using settings 'BookManager.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

运行之后,在浏览器打开 http://127.0.0.1:8000/admin,使用刚才创建的用户名密码登陆。

3、注册模型类

刚打开管理员界面的时候,只能看到认证和授权管理栏,这时候就需要将模型类注册进去。

修改admin.py代码

1
2
3
4
5
# BookManager/Book/admin.py
from django.contrib import admin
from Book.models import BookInfo,PeopleInfo
admin.site.register(BookInfo)
admin.site.register(PeopleInfo)

刷新浏览器页面,即可看到刚添加的两个模型类。如果页面无法加载,可以看看是不是服务出现异常,如果出现异常,重新启动服务即可。

4、自定义站点管理界面

在管理页面中,随便添加点数据,之后会发现书籍的名称都显示成了BookInfo object

此时,只需要在model.py里的class里添加以下内容即可。

1
2
def __str__(self):
return self.name

model.py完整的代码就是这个样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# BookManager/Book/models.py
from django.db import models

class BookInfo(models.Model): # 定义数据信息类模型
name = models.CharField(max_length=10) # 设计name属性
def __str__(self):
return self.name

class PeopleInfo(models.Model): # 定义人物信息类模型
name = models.CharField(max_length=10)
gender = models.BooleanField()
book = models.ForeignKey(BookInfo,on_delete=models.CASCADE)
def __str__(self):
return self.name

此时,再刷新页面,就可以看到显示正常了,同样 people info 界面也是正常的了。

但是,这样显示还是不够直观,所以就需要自定义站点管理界面了,接下来修改admin.py页面,添加以下语句:

1
2
class PeopleInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'gender', 'book']

admin.py完成的代码如下:

1
2
3
4
5
6
7
8
9
# BookManager/Book/admin.py
from django.contrib import admin
from Book.models import BookInfo, PeopleInfo

class PeopleInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'gender', 'book']

admin.site.register(BookInfo)
admin.site.register(PeopleInfo, PeopleInfoAdmin)#注意此处添加PeopleInfoAdmin以注册

再来刷新一下页面,就舒服很多了。

参考链接:

https://youtu.be/BXyGr9JQVcc

https://www.cnblogs.com/Demon-Mx/p/8385318.html

https://blog.csdn.net/qq_35965090/article/details/81663941

更多信息欢迎关注我的微信公众号:TeamsSix