我们正在使用Python3.4 / Django1.8.4,我们正在目睹一个关于我们user
模型的奇怪现象,特别是这个模型的timezone
字段。
当我们进行迁移时,新的迁移文件将包含一个更改所述时区字段的操作,但操作中包含的所有属性都已设置为迁移尝试分配的相同值!
有3个这样的领域,它们是:
1)default
- 值为"UTC"
2)max_length
- 值30
和
3)choices
- 包含时区名称/值的非常长的元组数组。
看起来像:
choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ... ]
迁移操作总是希望将timezone
字段的这3个属性设置为完全相同的3个对应值,即使它们已经设置为这样的值!它本质上是一种冗余的,无用的操作。
有时当我们运行makemigrations
时,应用程序不会发生任何更改,除了到这个愚蠢的领域!
1)为什么会这样?
2)我们如何防止这种情况?该应用程序认为在他们不需要迁移时会感到烦恼。
虽然字段的相同3个属性始终设置为完全相同的值,但它们在操作中出现的顺序似乎是不确定的(可能是因为django使用无序dict
实例来存储数据用于生成迁移文件。)
我们在模型中定义的choices
字段是在最初运行应用时动态生成的。 (煮沸的)代码如下所示:
class MyUser(models.Model):
f_name = models.CharField(max_length=32398) # Gotta accomodate those crazy south-eastern names haha
l_name = models.CharField(max_length=94823)
# ...
# more fields and stuff etc.
# ...
time_zone = models.CharField(default="UTC", choices=TIMEZONE_CHOICES, max_length=30)
重要的部分是choices=TIMEZONE_CHOICES
,这是先前定义的:
import pytz
TIMEZONE_CHOICES = ()
for time_zone in pytz.common_timezones:
TIMEZONE_CHOICES += ((time_zone, time_zone),)
只是包含这些信息,以防它被证明是相关的。
答案 0 :(得分:1)
尝试将pytz
的时区的简单列表复制到您的项目中,这样您就可以确定选择不依赖于第三方
答案 1 :(得分:1)
您可以尝试使用现有的包,该包允许您将时区直接用作模型字段。
https://pypi.python.org/pypi/django-timezone-field/
class MyModel(models.Model):
timezone1 = TimeZoneField(default='Europe/London') # defaults supported
答案 2 :(得分:0)
您的时区可能在不同的运行中以不同的顺序出现。试试
import pytz
TIMEZONE_CHOICES = ()
for time_zone in pytz.common_timezones:
TIMEZONE_CHOICES += ((time_zone, time_zone),)
TIMEZONE_CHOICES = sorted(TIMEZONE_CHOICES) # sort list to make it consistent
另外--一个小问题,因为它只在启动时运行--但是建立一个重复连接的大元组可能比这贵得多
import pytz
TIMEZONE_CHOICES = sorted((tz,tz) for tz in pytz.common_timezones)