Django模型层(models.py)之模型创建
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
问题解决。