在Django
的2.0
版本之后,在使用自己创建app中的__init__.py
文件中调用pymysql
包,使用如下语句
import pymysql
pymysql.install_as_MySQLdb()
当运行时会出现如下错误:
在网上搜了很多攻略,其中的一些方法是找到Python安装路径下的Python36-32\Lib\site-packages\django\db\backends\mysql\base.py文件
将文件中的如下代码注释掉即可:
if version < (1, 3, 3):
raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
但是,如果以后MySQL版本更新了,你必须使用更新后的MySQL怎么办呢?
原因是处在了app中__init__.py
文件中写的那一句话中。因为之前MySQLdb不支持Python3.5,所以使用pymysql.install_as_MySQLdb()
,来时用pymysql来代替MySQLdb,但是pymysql的版本又不符合mysqlclient的需求,所以才报错。
解决办法:
最新版本的MySQLclient进行了优化,并不需要在__init__.py
中写那一句话,也可以直接连接MySQL。所以app中__init__.py
中不写那一句话就可以执行了。
这样就结束了吗?
还有新的错误:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
在使用ORM进行数据库操作的时候,假如创建的有一对一
或者一对多
的连表时,会有这样的问题。
class OneToOneField(ForeignKey):
def __init__(self, to, on_delete, to_field=None, **kwargs):
kwargs['unique'] = True
super().__init__(to, on_delete, to_field=to_field, **kwargs)
class ForeignKey(ForeignObject):
def __init__(self, to, on_delete, related_name=None, related_query_name=None,
limit_choices_to=None, parent_link=False, to_field=None,
db_constraint=True, **kwargs):
super().__init__(to, on_delete, from_fields=['self'], to_fields=[to_field], **kwargs)
class ManyToManyField(RelatedField):
def __init__(self, to, related_name=None, related_query_name=None,
limit_choices_to=None, symmetrical=None, through=None,
through_fields=None, db_constraint=True, db_table=None,
swappable=True, **kwargs):
super().__init__(**kwargs)
可以看到,在这两个类定义的时候,在__init__()
函数中,都有一个叫做on_delete的参数,这也是为什么在创建一对一、一对多链表操作的时候会报错的原因。而在多对多的链表操作中却没有这个参数,所以在创建多对多的表格时,不用考虑这个属性。
那么on_delete
都有什么值?
on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE, # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET, # 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
参考链接:
https://blog.csdn.net/buxianghejiu/article/details/79086011