Django@Python 3常见问题

Django@Python 3常见问题
环境搭建及常见配置
详情可参见Django环境搭建及开发

# 如果同时安装了Python 2和Pyhton 3要指定版本
mkvirtualenv -p python3 env
或
mkvirtualenv --python=python3路径 env

pip install django mysqlclient
pip install django-crispy-forms django-formtools httplib2

虽然很多领域如机器学习的开发者当前更青睐于Python 2,但Python 3已经被越来越多的开发者们所使用,本文旨在整理Python 3环境下安装最新Django版本所出现的问题,其中有很多内容和Python 2下相似或相同。

1.用户表重写

在继承AbstractUser表重写该类时会提示Reverse accessor for ‘User.*’ clashes with reverse accessor for ‘*.*’

auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'UserProfile.groups'.
	HINT: Add or change a related_name argument to the definition for 'User.groups' or 'UserProfile.groups'.
auth.User.user_permissions: (fields.E304) Reverse accessor for 'User.user_permissions' clashes with reverse accessor for 'UserProfile.user_permissions'.
	HINT: Add or change a related_name argument to the definition for 'User.user_permissions' or 'UserProfile.user_permissions'.

解决这一问题只需要按照你定义的app名称和类名在settings.py中添加如下内容:

AUTH_USER_MODEL = 'appName.ClassName'

此外添加图片时要按照所提示的安装Pillow

users.UserProfile.avatar: (fields.E210) Cannot use ImageField because Pillow is not installed.
	HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command "pip install Pillow".

MySQL Strict Mode && InconsistentMigrationHistory

# 报错
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
	HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors.
# setttings.py的DATABASES下配置
'OPTIONS': {
    'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
}
# 报错
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.0001_initial on database 'default'.
# 针对以上报错请备份数据库,删除所有数据表以及migration文件重新执行makemigrations, migrate指令

2.settings.py常见配置

# 将所有新建app合并到apps目录下
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
# 语言
LANGUAGE_CODE = 'zh-hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

3. Warning: (1366, “Incorrect string value…)
lib/python3.6/site-packages/django/db/backends/mysql/base.py:101: Warning: (1366, “Incorrect string value: ‘\\xE7\\x94\\xA8\\xE6\\x88\\xB7…’ for column ‘name’ at row *”)
出现以上错误是在执行migrate时报出,原因是代码中存在中文,实际测试并不影响数据表的生成。解决方法首先查看数据库是否使用UTF-8编码(Python 3),然后可尝试在中文字符的引号前添加u或在文件头添加# coding:utf-8(Python 2),报错中的Unicode为“用户”二字,如何进行输出呢?

# Python 2
# coding:utf-8
a = '\xE7\x94\xA8\xE6\x88\xB7'
print a
# Python 3
a = '\xE7\x94\xA8\xE6\x88\xB7'
a = a.encode('raw_unicode_escape').decode()
print (a)

4. CSRF verification failed. Request aborted.
在form表单内部添加{% csrf_token %}

5.error: command ‘clang’ failed with exit status 1(pymssql)
Failed building wheel for pymssql
MacOS解决方法:

brew unlink freetds; 
brew install freetds@0.91;
brew link --force freetds@0.91

6.安装Pillow缺少zlib的问题

7.django.db.utils.OperationalError: (1050, “Table ‘xxx’ already exists”)

这通常是由于删除 migrations 目录下迁移记录以及django_migrations表中对应内容,但数据表中仍存在该字段所致,在 migrate 时添加–fake 参数可解决这一问题

 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.