前言
- 上接博文:Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld。
- 紧跟上一篇博文,本文主要基于上一篇项目的内容,配置mysql,创建model实例,自动创建数据库表,进行操作model,并进行反思(不采用自动创建表,如何操作mysql的表)
- 有兴趣可以添加我,一起探讨技术。
- 加V:
Fengfl1222
,名称:insist科技。 要资料
,申请备注为:CSDN+地方
,如CSDN山东。想接项目一起努力进步
,申请备注为:CSDN+地方+项目
,如CSDN+山东+项目,添加成功之后,可以发一份简历。- 本人介绍:211高校(北京交通大学)计算机研究生,本科双非计算机毕业后,校招进入军工,工作2个月离职后进入阿里,工作两年后离职考研,现已毕业,入职济南某大厂。主要技术栈:java、python、vue、react等web开发需求。已有开发团队,如果有空闲时间想一个接项目者,可以加我呦。
- 不按上诉规则添加好友者,不予通过。
- 加V:
- 项目环境
- python: 3.11.5
- django:4.1
一、项目初始化搭建
1、创建项目:test_models_django
详细创建请看博文一:Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
对前面的搭建流程梳理简化。
django-admin startproject test_models_django
:创建项目test_models_djangocd test_models_django
python manage.py migrate
python manage.py runserver
:运行项目- 浏览器输入网址:
http://127.0.0.1:8000/
,结果如下,Django项目搭建成功 - 使用
pycharm
打开如下。配置环境啥的请看博文一。
2、创建应用app01
python manage.py startapp app01
:创建应用app01
主包中配置应用
app01
,如下所示:app01
中的urls.py
和views.py
。(没有则新建)主包中的
urls.py
浏览器输入网址:
http://127.0.0.1:8000/hello
,结果如下,应用搭建成功
二、配置mysql
主包中settings.py
。
默认的数据库配置如下。
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
修改后如下所示
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "数据库名",
"USER": "用户",
"PASSWORD": "密码",
"HOST": "ip",
"PORT": "3306"
}
}
保存后,系统报错,缺少mysql插件,需要安装mysqlclient
,
执行以下命令安装
pip install mysqlclient
或者使用conda
来安装
conda install mysqlclient
python manage.py runserver
:然后成功运行。
三、创建model实例,自动创建数据库表
1、创建对象User类
app01
包中model.py
,添加用户类User
。- 子类
Meta
中定义表的元数据,我这里指定了表的名称为f_user_01
from django.db import models
# Create your models here.
class User_01(models.Model):
u_id = models.AutoField(primary_key=True)
username = models.CharField(max_length=64, null=True)
name = models.CharField(max_length=64, null=True)
password = models.CharField(max_length=64, null=True)
sex = models.CharField(max_length=64, null=True)
age = models.CharField(max_length=64, null=True)
phone = models.CharField(max_length=64, null=True)
email = models.CharField(max_length=64, null=True)
unit = models.CharField(max_length=64, null=True)
avatar = models.CharField(max_length=64, null=True)
status = models.CharField(max_length=64, null=True)
create_time = models.CharField(max_length=64, null=True)
delete_time = models.CharField(max_length=64, null=True)
update_time = models.CharField(max_length=64, null=True)
class Meta:
db_table = "f_user_01"
2、执行命令
# 生成迁移数据
python manage.py makemigrations
# 生成数据库表
python manage.py migrate
执行完第一个命令,会在当前包app01中生成初始化文件,仅仅对我们的类做了一个解读。
执行完第二个命令,会在数据库中生成数据库表。
数据库表生成如下所示,只有
f_user_01
是我们要生成的表,上面的其他表都是Django系统默认生成的表。暂且不管。(未圈中的与本项目无关)
四、思考问题(****)
- 其实大多数时候,都是自己创建表,不需要自动创建表,那么从
models.py
中创建了对象类,应该怎么和自己创建的数据库表对应呢。 - 或者说,是否可以直接通过
model.py
不创建新表,直接操作数据库中对应的表呢。 - 那就实验一下吧,自己手动创建数据库表,然后手动创建
models.py
,在执行迁移命令,看是否还会生成新的表呢。
1、是否会生成新表呢(答案报错)
数据库创建表 f_user
。具体如下所示。(如上面截图所示,我这里已经创建好了)models.py
添加User
类,与数据库表中字段一一对应。 和f_user_01
表一样,唯一的不一样就说最后的时间类型改为DateTime
。数据库也修改成相应的了。
class User(models.Model):
u_id = models.AutoField(primary_key=True)
username = models.CharField(max_length=64, null=True)
name = models.CharField(max_length=64, null=True)
password = models.CharField(max_length=64, null=True)
sex = models.CharField(max_length=64, null=True)
age = models.CharField(max_length=64, null=True)
phone = models.CharField(max_length=64, null=True)
email = models.CharField(max_length=64, null=True)
unit = models.CharField(max_length=64, null=True)
avatar = models.CharField(max_length=64, null=True)
status = models.CharField(max_length=64, null=True)
create_time = models.CharField(max_length=64, null=True)
delete_time = models.CharField(max_length=64, null=True)
update_time = models.CharField(max_length=64, null=True)
class Meta:
db_table = "f_user"
执行命令如下,看是否会报错等其他情况。
# 生成迁移数据
python manage.py makemigrations
# 生成数据库表
python manage.py migrate
执行第一个命令后,migrations
中生成了一个新的映射迁移。新的类,生成了一个新的模型类。
执行第二个命令后,报错,如下:(说明表已经存在)
2、总结
models.py
中指定了表名,如果数据库表中没有则创建,有则报错。
接下来对这两个表进行添加操作。
五、f_user_01和f_user的添加操作
1、f_user_01中的添加操作(自动生成的表)
a、views.py
from django.http import HttpResponse
from app01 import models
import json
def hello_world(request):
return HttpResponse("app01 Hello, World!")
def addUser01(request):
models.User_01.objects.create(username='admin', name='冯坚持', password='123456', sex='男', age='18',
phone='1234567890', email='123456789@163.com', unit='1-1-1', avatar='asdad',
status='1', create_time='20240104 12:12:22', delete_time='20240104 12:12:22',
update_time='20240104 12:12:22')
result = {
'code': 0,
'msg': 'success',
'data': ''
}
return HttpResponse(json.dumps(result, ensure_ascii=False), content_type='application/json')
b、urls.py
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello_world),
path('addUser01/', views.addUser01),
]
c、测试
- 浏览器输入:
http://127.0.0.1:8000/addUser01/
- 查看mysql数据库,数据插入成功
2、f_user中的添加操作(手动在mysql创建的表)
a、views.py
from django.http import HttpResponse
from app01 import models
import json
from django.utils import timezone
from datetime import datetime
def addUser(request):
print(timezone.now()) # 使用 timezone.now() 获取当前时间
print(datetime(2023, 6, 6, 12, 0, 0)) # 手动设置 datetime 值,可以使用 Python 的 datetime 模块
models.User.objects.create(username='admin', name='冯坚持', password='123456', sex='男', age='18',
phone='1234567890', email='123456789@163.com', unit='1-1-1', avatar='asdad',
status='1', create_time=timezone.now(), delete_time=timezone.now(),
update_time=timezone.now())
result = {
'code': 0,
'msg': 'success',
'data': ''
}
return HttpResponse(json.dumps(result, ensure_ascii=False), content_type='application/json')
b、urls.py
from django.urls import path
from . import views
urlpatterns = [
path('hello/', views.hello_world),
path('addUser01/', views.addUser01),
path('addUser/', views.addUser),
]
c、测试
- 浏览器输入:
http://127.0.0.1:8000/addUser/
- 查看mysql数据库,数据插入成功
d、print输出
3、发现问题
a、问题
在运行界面,发现如下提示。
b、原因
意思是有一个没有应用的迁移类,因为在第四章,执行了命令python manage.py makemigrations
,所以在migrations中生成了对应迁移类User,但是其表f_user在数据库中已经存在了,所以,在执行第二个命令python manage.py migrate
报错了,提示表已经存在。
这就是出现上面警告的原因。
c、解决
对于数据库中已经存在的表,只在models.py中声明即可,不用执行迁移的两个命令。现在目前的情况,删除0002__user.py
即可。
d、删除之后再运行
在执行f_user
表的添加请求测试如下。
六、总结
- 配置mysql,需要安装mysqlclient,编写models的实体类,通过迁移命令可以自动生成mysql数据库表结构。
- 如果数据库表中已经创建好表,则只在model.py中创建对应实体类即可,不用执行迁移的两个命令。(这里就和java对应上了,直接编写对应实体类和sql即可)
- 如果数据库没有创建好表,可以在models设计号实体类,使用迁移命令即可自动生成mysql数据库表结构。