[英]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.