Django3创建数据库表模型及 Django 管理页面

前提条件

Django3创建项目及应用

查看所使用的数据库

打开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)

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值