Django的MonthArchiveView返回“表'mysql.time_zone'不存在”

时间:2019-06-12 04:50:08

标签: python django python-3.x

我想使用以下URL查看档案:

example.com/2019/06
example.com/2018/11

但是,访问后,  django.db.utils.ProgrammingError: (1146, "Table 'mysql.time_zone' doesn't exist")返回。

如果我将settings.py中的USE_TZ更改为False,错误消失了,我可以正常访问它,但是我不想为False。

urls.py

path('<int:year>/<int:month>', ArchiveList.as_view(month_format='%m'), name='archive_list'),

views.py

class ArchiveList(MonthArchiveView):
    model = BlogPost
    template_name = 'blog/post_list.html'
    date_field = 'created_date'
    month_format = '%m'
    year_format = '%Y'
    allow_future = True

    def get_month(self):
        month = super(ArchiveList, self).get_month()
        return month

    def get_year(self):
        year = super(ArchiveList, self).get_year()
        return year

models.py

class BlogPost(models.Model, HitCountMixin):
    author = models.ForeignKey('auth.User', blank=False, on_delete=models.CASCADE)
    main_image = FileBrowseField("mainimage", max_length=200, directory="media/uploads/thumbnail/",
                                 extensions=[".jpg", ".png"], blank=False, null=True)
    category = models.ForeignKey('SubCategory', verbose_name='category', default=3, on_delete=models.PROTECT)
    title = models.CharField(max_length=33, blank=False)
    description = models.TextField(max_length=108, default='', blank=False)
    content = FroalaField(default='', blank=False, null=False)
    created_date = models.DateTimeField(default=timezone.now, blank=False)
    published_date = models.DateTimeField(blank=True, null=True)
    is_public = models.BooleanField(default=True)
    hit_count_generic = GenericRelation(
        HitCount, object_id_field='object_pk',
        related_query_name='hit_count_generic_relation')

settings.py

USE_I18N = True

USE_L10N = True

USE_TZ = True

我现在该怎么办?

1 个答案:

答案 0 :(得分:0)

解决了! 原因是mysql的时区不是UTC。

首先,检查time_zone。

mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

如果不是UTC,请先阅读时区信息。

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

并将这些信息写入~/etc/my.cnf

[mysqld_safe]
timezone = UTC

[mysqld]
default_time_zone = UTC

然后重新启动mysql并完成!

$ mysql.server restart

Shutting down MySQL
.. SUCCESS!
Starting MySQL
. SUCCESS!