Created
November 9, 2019 10:42
-
-
Save andelf/159512bef25cbd6a95779db301d3cd9e to your computer and use it in GitHub Desktop.
fix wrong django timezone
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import os.path | |
from datetime import datetime, timedelta | |
from pprint import pprint | |
import pytz | |
__dir__ = os.path.dirname(__file__) | |
__proj_dir__ = os.path.dirname(__dir__) | |
sys.path.insert(0, __proj_dir__) | |
import django | |
from django.conf import settings | |
from django.db import transaction, models | |
import django.apps | |
django.setup() | |
original_tz = 'America/Chicago' | |
current_tz = 'Asia/Shanghai' | |
def get_model_datetime_fields(model): | |
fields_need_fix = [] | |
for f in model._meta.get_fields(): | |
if isinstance(f, models.DateTimeField): | |
fields_need_fix.append(f.attname) | |
return fields_need_fix | |
def fix_datetime(val): | |
TZ = pytz.timezone(original_tz) | |
val = val.astimezone(pytz.UTC) | |
val = val.astimezone(TZ) | |
val = val.replace(tzinfo=None) | |
return val | |
@transaction.atomic | |
def fix_model(model, fields): | |
for obj in model.objects.all(): | |
for field in fields: | |
val = getattr(obj, field) | |
if val: | |
fixed_val = fix_datetime(val) | |
print(val, fixed_val) | |
setattr(obj, field, fixed_val) | |
obj.save() | |
if __name__ == "__main__": | |
for model in django.apps.apps.get_models()[::-1]: | |
if not model.objects.count(): | |
continue | |
fields = get_model_datetime_fields(model) | |
if not fields: | |
continue | |
print(model) | |
print(' ', fields) | |
fix_model(model, fields) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment