前提条件
查看所使用的数据库
打开test01/settings.py,查看使用的是sqlite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
创建模型(ORM框架)
1、编辑user/models.py文件
from django.db import models
# 用户类
class YongHu(models.Model):
# CharField字符字段、max_length字符串的最大长度
user_name = models.CharField(max_length=50)
# DateTimeField日期时间字段
pub_date = models.DateTimeField()
2、生成迁移文件
(py_huanjing01) [root@WzcWyt test01]# python manage.py makemigrations user
Migrations for 'user':
user\migrations\0001_initial.py
- Create model YongHu
(py_huanjing01) [root@WzcWyt test01]#
生成一个文件
3、查看人类可读的sql(可以不做)
(py_huanjing01) [root@WzcWyt test01]# python manage.py sqlmigrate user 0001
BEGIN;
--
-- Create model YongHu
--
CREATE TABLE "user_yonghu" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "user_name" varchar(50) NOT NULL, "pub_date" datetime NOT NULL);
COMMIT;
(py_huanjing01) [root@WzcWyt test01]#
4、执行迁移
(py_huanjing01) [root@WzcWyt test01]# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, user
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK
Applying user.0001_initial... OK
(py_huanjing01) [root@WzcWyt test01]#
5、进入test01项目目录查看db.sqlite3数据库,查看新创建的user_yonghu(应用名_类名)表
# 进入指定数据库
(py_huanjing01) [root@WzcWyt test01]# sqlite3 db.sqlite3
# 查看所有表
sqlite> .tables
auth_group django_admin_log
auth_group_permissions django_content_type
auth_permission django_migrations
auth_user django_session
auth_user_groups user_yonghu
auth_user_user_permissions
# 查看表结构
sqlite> .schema user_yonghu
CREATE TABLE "user_yonghu" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "user_name" varchar(50) NOT NULL, "pub_date" datetime NOT NULL);
# 退出sqlite3
sqlite>.quit
(py_huanjing01) [root@WzcWyt test01]#
6、给数据库表添加数据
(py_huanjing01) [root@WzcWyt test01]# python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from user.models import YongHu
>>> from django.utils import timezone
# 保存数据
>>> u = YongHu()
>>> u.user_name = 'xiaohong'
>>> u.pub_date = timezone.now()
>>> u.save()
# 查询数据
>>> b2 = YongHu.objects.get(id=1)
>>> type(b2)
<class 'user.models.YongHu'>
>>> b2.user_name
'xiaohong'
>>> b2.pub_date
datetime.datetime(2021, 5, 12, 6, 30, 31, 352358, tzinfo=<UTC>)
>>> b2.id
1
# 修改时间
>>> b2.pub_date = timezone.now()
>>> b2.save()
# 删除数据
>>> b2.delete()
(1, {'user.YongHu': 1})
# 退出
>>> quit()
(py_huanjing01) [root@WzcWyt test01]#
查看sqlite3数据库命令
(py_huanjing01) [root@WzcWyt test01]# sqlite3 db.sqlite3
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
# 查询
sqlite> select * from user_yonghu;
1|xiaohong|2021-05-12 02:54:08.156357
# 退出sqlite3
sqlite>.quit
一对多表
1、修改user/models.py
from django.db import models
# 用户类
class YongHu(models.Model):
# CharField字符字段、max_length字符串的最大长度
user_name = models.CharField(max_length=50)
# DateTimeField日期时间字段
pub_date = models.DateTimeField()
# 新增部分================================================
# 角色类
class JueSe(models.Model):
# 建立一对多关系
yong_hu = models.ForeignKey(YongHu, on_delete=models.CASCADE)
# 角色名称
role_name = models.CharField(max_length=50)
# 行别:True男,False女
xing_bie = models.BooleanField(default=True)
# 是否删除0正常1删除
role_del = models.IntegerField(default=0)
2、生成迁移文件
(py_huanjing01) [root@WzcWyt test01]# python manage.py makemigrations user
Migrations for 'user':
user\migrations\0002_juese.py
- Create model JueSe
(py_huanjing01) [root@WzcWyt test01]#
查看生成的文件
3、执行迁移
(py_huanjing01) [root@WzcWyt test01]# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, user
Running migrations:
Applying user.0002_juese... OK
(py_huanjing01) [root@WzcWyt test01]#
4、进入test01项目目录查看db.sqlite3数据库,查看新创建的user_juese(应用名_类名)表
# 进入指定数据库
(py_huanjing01) [root@WzcWyt test01]# sqlite3 db.sqlite3
# 查看所有表
sqlite> .tables
auth_group django_admin_log
auth_group_permissions django_content_type
auth_permission django_migrations
auth_user django_session
auth_user_groups user_juese
auth_user_user_permissions user_yonghu
# 查看表结构
sqlite> .schema user_juese
CREATE TABLE "user_juese" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "role_name" varchar(50) NOT NULL, "xing_bie" bool NOT NULL, "role_del" integer NOT NULL, "yong_hu_id" integer NOT NULL REFERENCES "user_yonghu" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "user_juese_yong_hu_id_de4ae717" ON "user_juese" ("yong_hu_id");
# 退出sqlite3
sqlite>.quit
(py_huanjing01) [root@WzcWyt test01]#
5、给数据库表添加数据
(py_huanjing01) [root@WzcWyt test01]# python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from user.models import YongHu,JueSe
>>> from django.utils import timezone
# 保存数据
>>> u = YongHu()
>>> u.user_name = 'TaoGe'
>>> u.pub_date = timezone.now()
>>> u.save()
>>> r = JueSe()
>>> r.role_name = '老师'
>>> r.xingbie = True
>>> r.role_del = 0
>>> r.yong_hu = u
>>> r.save()
>>> r2 = JueSe()
>>> r2.role_name = 'nanLaoShi'
>>> r2.yong_hu = u
>>> r2.save()
# 查询数据
>>> r3 = JueSe.objects.get(id=1)
>>> r3.role_name
'老师'
>>> r3.xing_bie
True
>>> r3.role_del
0
>>> r3.yong_hu
<YongHu: YongHu object (2)>
>>> r3.yong_hu.user_name
'TaoGe'
# 由一查多,注意:是(多的类名小写_set)========================
>>> u.juese_set.all()
<QuerySet [<JueSe: 老师>, <JueSe: nanLaoShi>]>
# 由多查一,注意:是(多内一的对象)========================
>>> j.yong_hu
<YongHu: TaoGe>
# 退出
>>> quit()
(py_huanjing01) [root@WzcWyt test01]#
查看sqlite3数据库命令
(py_huanjing01) [root@WzcWyt test01]# sqlite3 db.sqlite3
# 查询
sqlite> select * from user_yonghu;
2|TaoGe|2021-05-12 06:38:32.277338
sqlite> select * from user_juese;
1|老师|1|0|2
2|nanLaoShi|1|0|2
# 退出sqlite3
sqlite>.quit
Django 管理页面
创建一个管理员账号
首先,我们得创建一个能登录管理页面的用户。请运行下面的命令:
$ python manage.py createsuperuser
键入你想要使用的用户名,然后按下回车键:
Username: admin
然后提示你输入想要使用的邮件地址:
Email address: admin@example.com
最后一步是输入密码。你会被要求输入两次密码,第二次的目的是为了确认第一次输入的确实是你想要的密码。
Password: **********
Password (again): *********
Superuser created successfully.
启动开发服务器
Django 的管理界面默认就是启用的。让我们启动开发服务器,看看它到底是什么样的。
如果开发服务器未启动,用以下命令启动它:
$ python manage.py runserver
现在,打开浏览器,转到你本地域名的 “/admin/” 目录, – 比如 “http://127.0.0.1:8000/admin/” 。你应该会看见管理员登录界面:
注意:如果是英文,需修改test01/settings.py文件
# LANGUAGE_CODE = 'en-us'
# TIME_ZONE = 'UTC'
# 本地化
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
注册模型类
应用user/admin.py
from django.contrib import admin
from user.models import YongHu, JueSe
# 注册模型类
admin.site.register(YongHu)
admin.site.register(JueSe)
在user/models.py添加def str(self):
from django.db import models
# 用户类
class YongHu(models.Model):
# CharField字符字段、max_length字符串的最大长度
user_name = models.CharField(max_length=50)
# DateTimeField日期时间字段
pub_date = models.DateTimeField()
def __str__(self):
# 返回姓名
return self.user_name
# 角色类
class JueSe(models.Model):
# 建立一对多关系
yong_hu = models.ForeignKey(YongHu, on_delete=models.CASCADE)
# 角色名称
role_name = models.CharField(max_length=50)
# 行别:True男,False女
xing_bie = models.BooleanField(default=True)
# 是否删除0正常1删除
role_del = models.IntegerField(default=0)
def __str__(self):
# 返回角色名
return self.role_name
注意:正常不会这么写,会用下面一种方式
新增、修改、删除均可操作
显示表内列名
修改user/admin.py
from django.contrib import admin
from user.models import YongHu, JueSe
class YongHuAdmin(admin.ModelAdmin):
list_display = ['id', 'user_name', 'pub_date']
class JueSeAdmin(admin.ModelAdmin):
list_display = ['id', 'role_name', 'xing_bie', 'role_del', 'yong_hu']
# 注册模型类
admin.site.register(YongHu, YongHuAdmin)
admin.site.register(JueSe, JueSeAdmin)