Django-10-从模板创建数据表以及sqlite3自带数据库示例

概述

要真正有意义的展示出数据,不能仅仅从静态页面获取信息,而是需要跟后端的数据库进行交互,例如从url拿到一个检索关键词,通过post/get请求从后端数据库检索到相应的信息后,再通过前端渲染展示出来。当然这仅仅是一个非常简单而常见的要求,总的来说数据库的增删查改都是以后需要用到的。
Django自带数据库sqlite3,可以直接使用,以此为例来展示上述过程,其他的数据库例如MySQL可以据此修改相应设置即可。

初始化sqlite3

Django在创建项目的时候自动创建一个db.sqlite3的数据库文件,可以在vscode通过sqliteviewer插件查看,可以看到是空表
在这里插入图片描述

  • 初始化数据库
python.exe .\manage.py migrate

Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
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

再次查看,已经生成了相应的初始化表了
在这里插入图片描述

真正创建一个数据库表

Django中创建一个数据库非常简单,只需要通过django.db.models.Model生成相应的类即可,这个类即是一个表,类的属性即对应着表格的字段,类的方法则对应着表格的增删查改。以往不得不通过底层数据库的sql语句变成直接面向对象(ORM,object realated model)的属性和方法定义,即可直接操作整个表。好处在于,无需考虑不同数据库语法,在改变其他数据库类型的时候只需要改一些配置,无需更改代码。整体步骤:

  • 1.创建相应的app
  • 2.在app中的models.py中定义数据表的类
  • 3.在settings.py的INSTALL_APPS中添加该应用的数据库类配置名称
  • 4.执行python manage.py makemigrations app以及python manage.py migrate app同步数据库
  • 语法:
from django.db import models
class 模型类名(models.Model):
	字段名 = models.字段类型(字段选项)

定义一个类其实就是一个数据表,每个类的objective就是一个数据行
models.py:

from django.db import models

# Create your models here.
# 定义一个名为Students的类


class Students(models.Model):  # 该类必须继承models.Model
    name = models.CharField(max_length=100, null=True)  # 字符字段,最大长度,允许空值
    age = models.IntegerField(null=True)  # 整数字段
    sex = models.CharField(max_length=10, null=True)
    height = models.FloatField(max_length=10, null=True) # 浮点字段
    weight = models.FloatField(null=True, blank=True)  # 允许为空值,不用填,否则该项必须填

settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'students.apps.StudentsConfig',  # 添加的数据库类,来自于students app下的apps文件中的StudentsConfig类
]

students app-apps.py是自动生成的,只需要将StudentsConfig类添加到上面的设置文件中即可

from django.apps import AppConfig


class StudentsConfig(AppConfig):
    name = 'students'

在执行上述两条迁移命令后,刷新数据库,可以看到,已经添加了一个名为students_students的表(改名称是students app名加上models中的类名组成)
在这里插入图片描述

  • 常用字段选项
    verbose_name:表头名称,每个字段最终在网页显示的表头名称
    primary_key:如果指定为Ture则该字段为主键,不在创建id
    blank:如果为True则允许该字段为空,不需要一定填写
    default:给予默认值,例如default=8
    以及其他选项(可查阅django文档)
    例如,创建一个字符串字段,要求长度限制30,不能为空,必须唯一,必须有索引
name = CharField(max_length=30, null=False, unique=True, db_index=True)

登记自定义表格,便于后台显示管理

  • 创建一个系统管理账户
    依次输入用户名、邮箱(可用来找回密码)以及密码
 python.exe .\manage.py createsuperuser
Username (leave blank to use 'yut'): 
Email address: 123@qq.com
Password: 
Password (again): 
This password is too common.      
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

在这里插入图片描述
我们可以看到对应的数据库表格新增了1个记录,包括用户名、密码等信息。我们可以通过默认的admin路由登录
在这里插入图片描述

我们可以看到,之前创建的StudentsDB表并未出现在admin页面,如何添加呢?只需要登记一下即可。在students app的admin.py中

from django.contrib import admin

from .models import StudentsDB  # 导入自定义表格的类
# Register your models here.
admin.site.register(StudentsDB)  # 登记该表格,便于在后台显示

然后刷新管理页面,即可看到新增的表
在这里插入图片描述
点击该表,可以看到目前为空
在这里插入图片描述点击add则可以看到之前定义好的字段
在这里插入图片描述

  • 前面定义好的字段如果blank = True则该字段可以为空比用填,否则该字段必须有值
    在这里插入图片描述

字段类型及注意

类型注意
BooleanField布尔型,True/False
CharField字符串,必须设置max_length
IntegerField整型
FloatField浮点型
DateField日期,参数3个,只能选一个,auto_now = True:每次保存对象时使用当前日期;auto_now_add = True:创建该对象日期;default:设置当前时间,例如‘2022-02-02‘
DateTimeField同上,但是更加精确到秒
DecimalField2个必须参数,可以生成010.00格式的数字,max_digits:总位数,包括小数后的位数;decimal_places :小数点后的位数
EmailField邮箱类型,包括@等符号检查
ImageField保存图片存储路径
TextField不定长文本

更改数据表名称

由于django默认是应用+类来命名数据表的,可以通过Meta类来更改
student.views.py

from django.models import models
class student(model.Model):
	name = CharField(max_length=10)
	class Meta: #固定写法
		db_table = 'Stuents' # 将原来的student_student表名变成Students

常见问题及解决

  • 1.执行python manage.py makemigrations时出现some field without default,原因在于新增字段时,原有数据不知道该如何赋值
    解决方法:选择2)在model.py中给字段添加一个选项default=xxx
  • 2.数据库迁移混乱
    解决方法:删除migrations目录下所有0000?xxx.py(__init__.py除外),再执行迁移数据库命令

参考

达内教育

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值