gpt4 book ai didi

python - Django 重复检测冗余迁移

转载 作者:太空狗 更新时间:2023-10-29 18:09:22 25 4
gpt4 key购买 nike

背景

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

仅包含此信息以防万一它被证明是相关的。

最佳答案

您可以尝试使用现有的包,它允许您直接将时区用作模型字段。

https://pypi.python.org/pypi/django-timezone-field/

class MyModel(models.Model):
timezone1 = TimeZoneField(default='Europe/London') # defaults supported

关于python - Django 重复检测冗余迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34663528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com