Django笔记:3.创建模型

建库建用户

1
2
3
4
5
6
7
8
-- 建库
create database djtest default charset=utf8;

-- 创建用户
CREATE USER 'djadmin'@'%' IDENTIFIED BY 'yourpasswd';

-- 为用户添加权限
GRANT ALL ON djtest.* TO 'djadmin'@'%';

项目配置

在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
'default' : {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'djtest', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3316, # 端口
'USER': 'djadmin', # 数据库用户名
'PASSWORD': 'yourpasswd', # 数据库密码
}
}

接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:

1
2
3
# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()

如果没有pymysql模块,请使用pip安装

定义模型

创建app

Django中如果要使用模型,必须先创建一个app,使用下面命令创建一个TestModel的app

1
django-admin.py startapp TestModel

安装mysqlclient,报找不到mysql_config的错误请参考本文最后的常见错误及解决方法1

在命令行中运行python3 manage.py migrate 来创建表结构

执行成功后生成了这些表结构

1
2
# 让 Django 知道我们在我们的模型有一些变更
python3 manage.py makemigrations TestModel

1
2
# 创建表结构
python3 manage.py migrate TestModel

数据库上也可以看到已经生成了新的数据表:TestModel_test,表名的组成结构为:应用名_类名(如:TestModel_test)

添加数据

djtest/djtest/目录下新建testdb.py,内容如下

1
2
3
4
5
6
7
8
9
10
from django.http import HttpResponse

from TestModel.models import Test


# 数据库操作
def insdb(request):
test1 = Test(name='moonwhite')
test1.save()
return HttpResponse("<p>数据添加成功!</p>")

urls.py中添加如下内容:

1
path('insdb/', testdb.insdb),

浏览器访问localhost:8080/testdb,即可向数据库中添加一条记录

登陆数据库查看:

获取数据

Django提供了多种方式来获取数据库的内容,如下代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def seldb(request):
# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
list = Test.objects.all()
str = ""
for var in list:
str += var.name + " "
return HttpResponse("<p>" + str +"</p>")

def seldb1(request):
# filter相当于SQL中的WHERE,可设置条件过滤结果
qs = Test.objects.filter(id=1)
str=""
for var in qs:
str += var.name + " "
return HttpResponse("<p>" + str +"</p>")

def seldb2(request):
# 获取单个对象
test2 = Test.objects.get(id=2)

return HttpResponse("<p>" + test2.name +"</p>")

def seldb3(request):
# 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
# Test.objects.order_by('name')[0:2]
# # 数据排序
# qs = Test.objects.order_by("id")

# 上面的方法可以连锁使用
qs = Test.objects.order_by("id")[0:4]

str = ""
for var in qs:
str += var.name + " <br>"


return HttpResponse("<p>" + str +"</p>")

更新数据

1
2
3
4
5
6
7
8
9
10
11
12
13

def upddb(request):
# 修改其中一个ID=2的记录的name字段,再save,相当于SQL: update table set name='newvalue' where id = 2
test1 = Test.objects.get(id = 2)
test1.name = 'moonwhite02'
test1.save()
# 另外一种方式
# Test.objects.filter(id=1).update(name='Google')

# 修改所有的列
# Test.objects.all().update(name='Google')
return HttpResponse('<p>' + "update success " + '</p>')

删除数据

1
2
3
4
5
6
7
8
9
10
11
12
def deldb(request):
# 删除id=1的数据
test1 = Test.objects.get(id=1)
test1.delete()

# 另外一种方式
# Test.objects.filter(id=1).delete()

# 删除所有数据
# Test.objects.all().delete()

return HttpResponse("<p>删除成功</p>")

常见错误及解决方法

1. pip install mysqlclient 报找不到mysql_config

pip install mysqlclient 后报错信息如下:

1
2
3
4
5
6
7
8
9
10
11
Collecting mysqlclient
Using cached mysqlclient-2.0.1.tar.gz (87 kB)
......
File "/private/var/folders/7p/r7xrt8r50l1cd6dh0dtz2n940000gp/T/pycharm-packaging/mysqlclient/setup_posix.py", line 65, in get_config
libs = mysql_config("libs")
File "/private/var/folders/7p/r7xrt8r50l1cd6dh0dtz2n940000gp/T/pycharm-packaging/mysqlclient/setup_posix.py", line 31, in mysql_config
raise OSError("{} not found".format(_mysql_config_path))
OSError: mysql_config not found
----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

解决方法:

1
2
3
4
brew install mysql-client
echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.bash_profile
export PATH="/usr/local/opt/mysql-client/bin:$PATH"
pip install mysqlclient

2

运行时可能报下面的错误:

1
2
3
4
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/mysql/base.py", line 36, in <module>
raise ImproperlyConfigured('mysqlclient 1.4.0 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0.10.1.

解决方法是在__init__.py文件中添加下面三行:

1
2
3
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()