Django重复检测冗余迁移

时间:2016-01-07 19:26:45

标签: python django

背景

我们正在使用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),)

只是包含这些信息,以防它被证明是相关的。

3 个答案:

答案 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)