- SyntaxError: Generator expression must be parenthesized
- ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'fault_reporting.userinfo', but app 'fault_reporting' isn't installed.
- RuntimeWarning: DateTimeField Message.date received a naive datetime .....
- TypeError: Object of type 'QuerySet' is not JSON serializable
- TypeError: Object of type Decimal is not JSON serializable
- AttributeError: Manager isn't available; 'auth.User' has been swapped for 'app01.UserInfo'
- Database returned an invalid datetime value. Are time zone definitions for your database installed?
- AttributeError: 'str' object has no attribute 'decode'
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
- ValueError: source code string cannot contain null bytes
- "block" tag with name "device_list_class" appears more than once
启动报错:SyntaxError: Generator expression must be parenthesized,有时候,在使用命令python manager.py runserver时,会发先启动失败,报错日志如下:
[root@cs es_demo]# python37 manage.py runserver
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f220f0edae8>
Traceback (most recent call last):
File "/usr/local/python/python37/lib/python3.7/site-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/usr/local/python/python37/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
autoreload.raise_last_exception()
File "/usr/local/python/python37/lib/python3.7/site-packages/django/utils/autoreload.py", line 250, in raise_last_exception
six.reraise(*_exception)
File "/usr/local/python/python37/lib/python3.7/site-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/usr/local/python/python37/lib/python3.7/site-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/usr/local/python/python37/lib/python3.7/site-packages/django/__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/python/python37/lib/python3.7/site-packages/django/apps/registry.py", line 85, in populate
app_config = AppConfig.create(entry)
File "/usr/local/python/python37/lib/python3.7/site-packages/django/apps/config.py", line 94, in create
module = import_module(entry)
File "/usr/local/python/python37/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/usr/local/python/python37/lib/python3.7/site-packages/django/contrib/admin/__init__.py", line 4, in <module>
from django.contrib.admin.filters import (
File "/usr/local/python/python37/lib/python3.7/site-packages/django/contrib/admin/filters.py", line 10, in <module>
from django.contrib.admin.options import IncorrectLookupParameters
File "/usr/local/python/python37/lib/python3.7/site-packages/django/contrib/admin/options.py", line 12, in <module>
from django.contrib.admin import helpers, widgets
File "/usr/local/python/python37/lib/python3.7/site-packages/django/contrib/admin/widgets.py", line 151
'%s=%s' % (k, v) for k, v in params.items(),
^
SyntaxError: Generator expression must be parenthesized
可以发现最后一行提示说是语法错误,说是生成器表达式有问题,那具体的报错行内容是'%s=%s' % (k, v) for k, v in params.items(),,可以看到,最后一个标点符号很有意思,我们找到源码文件对应的行,把这个标点符号去掉即可。
ps:如果是pycharm中修改的话,由于这个文件是源码,还要注意提示框中选择I want to edit this file anyway。
see also:django1.11 启动错误:Generator expression must be parenthesized
ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'fault_reporting.userinfo', but app 'fault_reporting' isn't installed.
在新创建的Django项目中执行makemigrations时,遇到:ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'fault_reporting.userinfo', but app 'fault_reporting' isn't installed.这类我们项目中不存在的app和模型类的错误。
而仔细观察,这个报错的app名字是我们之前某个项目中的app名字,而模型类则是那个app中定义的模型类,但现在却在我们当前的项目中报错了。究其原因,则是因为之前的项目中的app缓存被存在了Django模块内的某些地方。
而我们当在新的项目中用到"某些地方"的功能时,执行了之前的缓存内容,从而引发错误。而普通的解决办法,就是删除当前项目中的.idea文件和__pycache__文件,然后就是删除migrations目录下的00开头的py文件都解决不了。甚至是卸载Django重新安装————都没用!
因为我们并没有删除Django模块中"某些地方"的缓存文件(pip uninstall Django都清不了这些缓存文件)。so,我们要手动去删除这这个"某个地方"的缓存文件。
打开你的解释器下的Lib\site-packages\django\contrib\admin\migrations目录,删除除了__init__.py外的其他的文件。然后再次执行makemigrations即可。
see also:ValueError in Django when running the “python manage.py migrate” command
RuntimeWarning: DateTimeField Message.date received a naive datetime .....
当在module.py中定义DateTimeField类型的字段,在插入记录时:
import time
models.Message.objects.create(
date=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
)
虽然能够保存成功,但会发现一条警告:
C:\Python36\lib\site-packages\django\db\models\fields\__init__.py:1447: RuntimeWarning: DateTimeField Message.date received a naive datetime (2019-06-20 19:51:55) while time zone support is active.
RuntimeWarning)
原因是,Django如果开启了Time Zone功能,则所有的存储和内部处理,甚至包括直接print显示全都是UTC的。只有通过模板进行表单输入渲染输出的时候,才会执行UTC本地时间的转换。所以我建议后台处理时间的时候,最好完全使用UTC,不要考虑本地时间的存在。而显示时间的时候,也避免手动转换,尽量使用Django模板系统代劳。
解决办法,可以在settings.py中将USE_TZ的默认True改为False。
USE_TZ = False
TypeError: Object of type 'QuerySet' is not JSON serializable
Django1.11 + Python3.6 + win10
可能的原因
在ROM与ajax交互时,难免会遇到传递queryset对象,但是你会发现使用JsonResponse并不好用:
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
def ui_index(request):
if request.method == 'POST':
pk = request.POST.get('pk')
result = ui_models.UiCase.objects.filter(case_vest_project=pk)
# return HttpResponse({"case": result})
return JsonResponse({"case": result}) # 依然不好使
就算使用JsonResponse({"case": result})依然不好使:
TypeError: Object of type 'QuerySet' is not JSON serializable
可能的解决办法
from django.core import serializers
def ui_index(request):
if request.method == 'POST':
pk = request.POST.get('pk')
result = ui_models.UiCase.objects.filter(case_vest_project=pk)
return JsonResponse({"case": serializers.serialize('json', result)})
这个时候,可以使用serializers来解决。然后前端的ajax正常接收即可,无需反序列化:
<script>
$(".selected_project").on('click', 'li', function () {
var pk = $(this).attr('pk');
$.ajax({
url: "{% url 'ui_index' %}",
type: "POST",
data: {'pk': pk},
success: function (data) {
console.log(typeof(data), data);
if (data) {
$.each(data, function (index, item) {
console.log(item.case_name, item.pk, )
})
}
}
})
})
</script>
see also:【已解决】Object of type 'QuerySet' is not JSON serializable
TypeError: Object of type Decimal is not JSON serializable
这个跟上面的报错原理一样,json无法序列化Decimal类型的数据,所以,还要加判断,自己处理:
class CustomJsonEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field, date):
return field.strftime('%Y-%m-%d')
elif isinstance(field, datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field, decimal.Decimal):
return float(field)
else:
return json.JSONEncoder.default(self, field)
class Books(View):
def get(self, request):
""" 查 """
books = Book.objects.values('title', 'price')
data_list = json.dumps(list(books), cls=CustomJsonEncoder)
return HttpResponse(data_list, content_type="application/json")
我的表结构是这样的:
from django.db import models
class Book(models.Model):
""" 书籍表 """
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2) # 999999.99
def __str__(self):
return self.title
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'app01.UserInfo'
这个问题应该是在扩展django auth表时,出现的问题,如下示例:
# settings.py
AUTH_USER_MODEL = "app01.UserInfo"
# app01\models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser): # 必须继承AbstractUser
# 在django默认的user表的基础上添加字段
phone = models.CharField(max_length=11, verbose_name='手机号')
# demo\test.py
import os
import django
from faker import Faker
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demo.settings") # demo:项目名称
django.setup()
from django.contrib.auth.models import auth, User
# from django.contrib.auth import get_user_model
# User = get_user_model()
fk = Faker(locale='zh_CN')
def foo():
for i in range(3):
User.objects.create_user(username=fk.name(), password='123', phone=fk.phone_number())
# objs = auth.authenticate(username='王文', password='123')
# print(objs)
if __name__ == '__main__':
foo()
上面的代码运行就会报错:
解决办法就是,当扩展auth表后,你的user对象就不能像原来那样使用了,应该这么用:
import os
import django
from faker import Faker
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demo.settings") # demo:项目名称
django.setup()
from django.contrib.auth.models import auth, User
# 导入它
from django.contrib.auth import get_user_model
User = get_user_model() # 用get_user_model返回的User覆盖掉上面的User,其它代码不变
fk = Faker(locale='zh_CN')
def foo():
for i in range(3):
User.objects.create_user(username=fk.name(), password='123', phone=fk.phone_number())
# objs = auth.authenticate(username='王文', password='123')
# print(objs)
if __name__ == '__main__':
foo()
Database returned an invalid datetime value. Are time zone definitions for your database installed?
时区问题:
解决,修改settings.py中的配置:
# 将
USE_TZ = True
# 改为:
USE_TZ = False
参考:
- https://stackoverflow.com/questions/40792628/django-mysql-database-returned-an-invalid-datetime-value
- https://www.codenong.com/cs109366948/
AttributeError: 'str' object has no attribute 'decode'
我在两种情况下遇到这个问题,而且也使用了两种方式进行解决,但后来测了下两种方式应该都可以。这里分别记录下。
情景1
Django2.2 + pymysql1.0.2 + mysql5.7
在Django2.2版本中,配置完毕MySQL的相关配置,重启服务时,发现报错:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
Exception in thread Thread-1:
Traceback (most recent call last):
File "c:\python36\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "c:\python36\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\utils\autoreload.py", line 54, in wrapper
fn(*args, **kwargs)
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\core\management\commands\runserver.py", line 120, in inner_run
self.check_migrations()
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\core\management\base.py", line 453, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
self.loader = MigrationLoader(self.connection)
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\migrations\loader.py", line 49, in __init__
self.build_graph()
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\migrations\loader.py", line 212, in build_graph
self.applied_migrations = recorder.applied_migrations()
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\migrations\recorder.py", line 73, in applied_migrations
if self.has_table():
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\migrations\recorder.py", line 56, in has_table
return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\backends\base\base.py", line 256, in cursor
return self._cursor()
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\backends\base\base.py", line 233, in _cursor
self.ensure_connection()
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\backends\base\base.py", line 217, in ensure_connection
self.connect()
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\backends\base\base.py", line 197, in connect
self.init_connection_state()
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\backends\mysql\base.py", line 231, in init_connection_state
if self.features.is_sql_auto_is_null_enabled:
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\utils\functional.py", line 80, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\backends\mysql\features.py", line 82, in is_sql_auto_is_null_enabled
cursor.execute('SELECT @@SQL_AUTO_IS_NULL')
File "D:\mydata\demo\all_env\django2.2\lib\site-packages\django\db\backends\utils.py", line 103, in execute
sql = self.db.ops.last_executed_query(self.cursor, sql, params)
File "D:\mydata\demo\all_env\django2.2\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'
经查,原因是Python安装目录下lib\site-packages\django\db\backends\mysql\operations.py这个文件中的last_executed_query方法中的源码写的有问题。
# 第140行开始
def last_executed_query(self, cursor, sql, params):
# With MySQLdb, cursor objects have an (undocumented) "_executed"
# attribute where the exact query sent to the database is saved.
# See MySQLdb/cursors.py in the source distribution.
query = getattr(cursor, '_executed', None)
# 下面的if条件导致报错
if query is not None:
query = query.decode(errors='replace')
return query
解决办法,在GitHub上,最新的Django版本源码中,https://github.com/django/django/blob/master/django/db/backends/mysql/operations.py`,第163-168行,该函数已经被修改为:
这就好办,我们照抄,将我们自己的源码也这么改下:
def last_executed_query(self, cursor, sql, params):
# With MySQLdb, cursor objects have an (undocumented) "_executed"
# attribute where the exact query sent to the database is saved.
# See MySQLdb/cursors.py in the source distribution.
query = getattr(cursor, '_executed', None)
# 修改前的源码
# if query is not None:
# query = query.decode(errors='replace')
# return query
# 修改后的源码
from django.utils.encoding import force_str # 只需要将这个导入,放到该模块的最上面即可
return force_str(query, errors='replace')
然后重启Django就好了。
参考:Django2.2报错::AttributeError: ''str'' object has no attribute ''decode'' | https://github.com/django/django/blob/master/django/db/backends/mysql/operations.py
情景2
python3.9.4 + django2.2 + pymysql1.0.2 + mysql5.7
这次是在Django中配置完了MySQL的相关配置之后,再做makemigrations时,遇到报错了:
xxdeMacBook-Pro:bookcms3 kanghua$ python3.9 manage.py makemigrations
Traceback (most recent call last):
File "/Users/kanghua/PycharmProjects/python-note/study/bookcms3/manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/management/base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/management/commands/makemigrations.py", line 101, in handle
loader.check_consistent_history(connection)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/migrations/loader.py", line 283, in check_consistent_history
applied = recorder.applied_migrations()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 73, in applied_migrations
if self.has_table():
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/migrations/recorder.py", line 56, in has_table
return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/base/base.py", line 256, in cursor
return self._cursor()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/base/base.py", line 233, in _cursor
self.ensure_connection()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection
self.connect()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/base/base.py", line 197, in connect
self.init_connection_state()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/mysql/base.py", line 231, in init_connection_state
if self.features.is_sql_auto_is_null_enabled:
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/utils/functional.py", line 80, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/mysql/features.py", line 82, in is_sql_auto_is_null_enabled
cursor.execute('SELECT @@SQL_AUTO_IS_NULL')
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/backends/utils.py", line 103, in execute
sql = self.db.ops.last_executed_query(self.cursor, sql, params)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/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'
然后,搞笑的是,我忘记了曾经解决过这个问题了,就又去百度搜的......
先说解决方案,按照报错的最后一行提示lib/python3.9/site-packages/django/db/backends/mysql/operations.py这个源码文件的146行报错了,那就改吧:
完事之后,重新做数据库迁移,应该就可以了:
xxdeMacBook-Pro:bookcms3 kanghua$ python3.9 manage.py makemigrations
Migrations for 'book':
book/migrations/0001_initial.py
- Create model Author
- Create model Publish
- Create model Book
感觉要比情景一中的解决要简单啊!最后,没啥说的,用哪种解决方式都行,只要能解决问题的方案就是好方案!
参考:Django+MySQL+python报错:AttributeError: ‘str‘ object has no attribute ‘decode‘
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
Django2.2 + Python3.6.8
在Django2.2和django3版本中,如果访问页面,后台报:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
这种情况是源码存在读文件编码没有设置的问题,根据报错的历史回溯发现,在你的*lib\site-packages\django\views\debug.py这个文件的331行有问题:
修改前:
修改后:
现在就可以正常的访问了。
参考:https://blog.csdn.net/qq_37232731/article/details/89684409
ValueError: source code string cannot contain null bytes
django项目中,报这个错误时,第一怀疑对象是各个py文件的编码格式不一样导致的,请检查并将所有文件的编码保持一致,推荐使用utf-8编码。
如果你用的是pycharm,File→Settings→Editor→File Encodings,修改Project Encoding和Properties Files都为UTF-8编码格式就完了。
这个报错指的是,在一个模板中(一个html页面中)不能同时定义多个同名的block块。
来自官网的解释:Finally, note that you can’t define multiple block tags with the same name in the same template. This limitation exists because a block tag works in “both” directions. That is, a block tag doesn’t just provide a hole to fill – it also defines the content that fills the hole in the parent. If there were two similarly-named block tags in a template, that template’s parent wouldn’t know which one of the blocks’ content to use.
that's all, see also: