我们正在使用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'), ... ]
Run Code Online (Sandbox Code Playgroud)
迁移操作总是希望将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)
Run Code Online (Sandbox Code Playgroud)
其中重要的部分是choices=TIMEZONE_CHOICES先前定义的:
import pytz
TIMEZONE_CHOICES = ()
for time_zone in pytz.common_timezones:
TIMEZONE_CHOICES += ((time_zone, time_zone),)
Run Code Online (Sandbox Code Playgroud)
只是包含这些信息,以防它被证明是相关的.
您可以尝试使用现有的包,该包允许您直接使用时区作为模型字段。
https://pypi.python.org/pypi/django-timezone-field/
class MyModel(models.Model):
timezone1 = TimeZoneField(default='Europe/London') # defaults supported
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
437 次 |
| 最近记录: |