[英]Django detecting redundant migrations repetitively
我们在 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),)
仅包含此信息以防万一它被证明是相关的。
尝试将时区的普通列表从pytz
到您的项目,这样您就可以确定选择不依赖于第三方
您可以尝试使用现有的包,它允许您直接将时区用作模型字段。
https://pypi.python.org/pypi/django-timezone-field/
class MyModel(models.Model):
timezone1 = TimeZoneField(default='Europe/London') # defaults supported
您的时区可能在不同的运行中以不同的顺序出现。 尝试
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.