2016-11-25 59 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