簡體   English   中英

Django 重復檢測冗余遷移

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM