2016-11-25 92 views
2

我正在做一些外部集成以將數據保存到Django模型。整合需要一些時間。所以我想創建一些臨時重複模型。我將數據創建到這些臨時模型中。完成該過程後,我將數據傳輸到實際模型。通過這樣做,我不會給系統任何停機時間。Django模型附加短語到app_label

class MyModelAbstract(models.Model): 
    my_field = models.CharField(max_length=50) 
    ... 

    class Meta: 
     abstract = True 

class MyModel(MyModelAbstract): 
    is_active = models.BooleanField(default=True) 

class MyModelTemp(MyModelAbstract): 
    pass 

如果我的應用程序名稱爲my_app比表名正在成爲my_app_mymodelmy_app_mymodeltemp。我想將其命名爲my_app_tmp_mymodeltemp。我可以用下面的做到這一點:

class MyModelTemp(MyModelAbstract): 
    class Meta: 
     app_label = 'my_app_tmp' 

但我不想寫app_label靜態。如果我更改名稱,我不想手動更改app_label。我想將其指定爲app_label = '%s_tmp' % app_label,但我無法訪問內部Meta類中的當前應用程序標籤。

此外,我可以通過爲這種情況創建新的元類來處理這個問題。我正在尋找一種更簡單的方法。

+0

AFAIK,這不能做,因爲你需要有遷移改變實際的表名和遷移不能動態 – e4c5

+0

我不想更改遷移行爲。我希望在註冊模型之前在創建新類時更改app_label。因此它不會影響遷移。 – scriptmonster

+0

需要更好地解釋該評論 – e4c5

回答

2

如果我的應用程序名稱是程序my_app比表名正在成爲my_app_mymodel和my_app_mymodeltemp

評論

app_label時使用ModelINSTALLED_APPS之外。現在您的意圖(假設)您需要另一個名爲前綴tmp的表。爲此,你需要db_table。我們可以通過將此代碼段放在每個模型下進行實時操作。

from django.db import connection 

Model._meta.db_table = Model._meta.db_table+ "_tmp" 
with connection.schema_editor() as schema: 
    schema.create_model(Model) 
+0

我的應用程序在'INSTALLED_APPS'中,我通常對錶的命名感到滿意。但對於某些表格,我想區分其他表格,但不會丟失app_label。我希望'tmp'在應用標籤和型號名稱之間。這樣,我將在管理產品的同時按順序看到它們。我不確定,但在我看來,你的建議可能會打破我的遷移!? – scriptmonster

+0

AFAIK它wouldnt.Anyway保持遷移文件在git或版本控制。 – itzMEonTV