Django数据库操作是十分重要的内容,这两天简单学习了数据库的操作,这里做个总结。
1.ORM简介
详细介绍可以参考这篇博客:
简单的来说,ORM就是对象-关系-映射。它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。
2.创建模型前的准备
- 在settings中配置databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'myorm_test', #需要连接的数据库名称
'USER':'xxx', #连接数据库的用户名
'PASSWORD':'xxx', #用户名对应的密码
'HOST':'127.0.0.1', #连接主机,这里是本机
'PORT':3306 #端口,默认是3306
}
}
- pymysql包的导入
在setting中导入包pymysql
- 在项目名文件下的__init__.py文件中写入:
import pymysql
pymysql.install_as_MySQLdb()
3.创建模型
在models.py中新建类
# 图书列表
class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
price = models.DecimalField(max_digits=7,decimal_places=2)
# max_digits:总位数(不包括小数点和符号),decimal_places:小数位数
publishs = models.ForeignKey(to="publish",on_delete=models.CASCADE,null=True)
authors = models.ManyToManyField(to="author")
# 出版社列表
class Publish(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
addr = models.CharField(max_length=100)
# 作者列表
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
country = models.CharField(max_length=20,null=True)
authordetail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE,null=True)
class AuthorDetail(models.Model):
id = models.AutoField(primary_key=True)
# country = models.CharField(max_length=20)
addr = models.CharField(max_length=100)
email = models.EmailField()
注意:
表间关系为多对多时,调用ManyToManyField()方法自动创建第三张表,第三张表中含有三个字段:第三张表的主键,关联第一张表的外键,关联第二张表的外键
表间关系为一对多时,调用ForeignKey()方法在多的那方创建关联一的那方的外键
表间关系为一对一时,调用OneToOneField()为两张表建立一对一关系
4.在terminal中执行数据迁移命令
python manage.py makemigrations
python manage.py migrate
!!!遇到的问题
执行python manage.py makemigrations
命令时,报错:
File "E:\PycharmProjects\MyORM_Test\venv\lib\site-packages\django\db\backends\mysql\base.py", line 36, in <module>
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
解决:
在"E:\PycharmProjects\MyORM_Test\venv\lib\site-packages\django\db\backends\mysql\base.py", line 36位置注释掉下列代码:
# if version < (1, 3, 13):
# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
再次执行
python manage.py makemigrations
继续报错:
File "E:\PycharmProjects\MyORM_Test\venv\lib\site-packages\django\db\backends\mysql\operations.py", line 146, in last_executed_query
query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'
解决:
在"E:\PycharmProjects\MyORM_Test\venv\lib\site-packages\django\db\backends\mysql\operations.py", line 146
位置修改代码如下:
query = getattr(cursor, '_executed', None)
if query is not None:
# query = query.decode(errors='replace') # 原始代码
query = query.encode(errors='replace') # 修改后
return query
问题解决。