启动报错: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(),,可以看到,最后一个标点符号很有意思,我们找到源码文件对应的行,把这个标点符号去掉即可。
Django - 报错集
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和模型类的错误。

Django - 报错集

而仔细观察,这个报错的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

see also:django中使用时间帅选报RuntimeWarning: DateTimeField Coupon.valid_begin_date received a naive datetime (2018-08-16 20:51:40.135425) while time zone support is active.

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()

上面的代码运行就会报错:

Django - 报错集
解决办法就是,当扩展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?

时区问题:
Django - 报错集
解决,修改settings.py中的配置:

# 将
USE_TZ = True
# 改为:
USE_TZ = False

参考:

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行,该函数已经被修改为:
Django - 报错集
这就好办,我们照抄,将我们自己的源码也这么改下:

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行报错了,那就改吧:

Django - 报错集

完事之后,重新做数据库迁移,应该就可以了:

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行有问题:
修改前:
Django - 报错集

修改后:
Django - 报错集
现在就可以正常的访问了。
参考:https://blog.csdn.net/qq_37232731/article/details/89684409

ValueError: source code string cannot contain null bytes

Django - 报错集

django项目中,报这个错误时,第一怀疑对象是各个py文件的编码格式不一样导致的,请检查并将所有文件的编码保持一致,推荐使用utf-8编码。
如果你用的是pycharm,File→Settings→Editor→File Encodings,修改Project Encoding和Properties Files都为UTF-8编码格式就完了。

这个报错指的是,在一个模板中(一个html页面中)不能同时定义多个同名的block块。
Django - 报错集
Django - 报错集

来自官网的解释: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:

Pycharm设置默认UTF8编码格式

相关文章: