2017-10-10 138 views
1

Django是创建调用时相同的迁移文件中重复创建相同的迁移:Django的迁移:正在与makemigrations

./manage.py makemigrations 

同样的迁移将在新的迁移创建文件每次makemigrations是不管的,如果运行变化是否被迁移。

过程看起来像这样:

./manage.py makemigrations app 

Migrations for 'app': 
project/app/migrations/0007_auto_20171010_1837.py 
- Alter field charge_type on charge 
- Alter field fee_type on fee 
- Alter field event_type on orderevent 


./manage.py migrate app 

Running migrations: 
Applying mws.0007_auto_20171010_1837... OK 


./manage.py makemigrations app 

Migrations for 'app': 
project/app/migrations/0008_auto_20171010_1838.py 
- Alter field charge_type on charge 
- Alter field fee_type on fee 
- Alter field event_type on orderevent 


./manage.py makemigrations app 

Migrations for 'app': 
project/app/migrations/0009_auto_20171010_1839.py 
- Alter field charge_type on charge 
- Alter field fee_type on fee 
- Alter field event_type on orderevent 

我很好奇,为什么相同的新移民继续与更新迁移的文件名被创建时没有变化正在以makemigrations之间的模型制作和迁移命令。

的模型是这样的:

当前应用模式:

class OrderEvent(models.Model): 
    client = models.ForeignKey('clients.Client') 

    SHIPMENT_EVENT = 'she' 
    REFUND_EVENT = 'ree' 
    CHARGEBACK_EVENT = 'cbe' 
    GUARANTEE_CLAIM_EVENT = 'gce' 

    EVENT_TYPE_CHOICES = { 
     (SHIPMENT_EVENT, 'Shipment Event'), 
     (REFUND_EVENT, 'Refund Event'), 
     (CHARGEBACK_EVENT, 'Chargeback Event'), 
     (GUARANTEE_CLAIM_EVENT, 'Guarantee Claim Event'), 
    } 

    event_type = models.CharField(max_length=3, choices=EVENT_TYPE_CHOICES) 
    amazon_order_id = models.CharField(max_length=19) 
    seller_order_id = models.CharField(max_length=19) 
    marketplace_name = models.CharField(max_length=14) 
    posted_date = models.DateTimeField(blank=True, null=True) 


class ShipmentItem(models.Model): 
    order_event = models.ForeignKey('OrderEvent') 
    seller_sku = models.CharField(max_length=128) 
    order_item_id = models.CharField(max_length=19) 
    quantity_shipped = models.IntegerField() 



class Charge(models.Model): 
    shipment_item = models.ForeignKey('ShipmentItem', blank=True, null=True) 

    PAYMENT_METHOD_FEE = 'pmf' 
    EXPORT_CHARGE = 'exc' 
    SAFET_REIMBURSEMENT = 'str' 
    OTHER = 'oth' 

    CHARGE_TYPE_CHOICES = { 
     (PAYMENT_METHOD_FEE, 'Payment Method Fee'), 
     (EXPORT_CHARGE, 'Export Charge'), 
     (SAFET_REIMBURSEMENT, 'SAFET Reimbursement'), 
     (OTHER, 'Other'), 
    } 
    charge_type = models.CharField(
     max_length=3, 
     choices=CHARGE_TYPE_CHOICES, 
     blank=True, 
     null=True 
    ) 
    charge_currency_code = models.CharField(
     max_length=3, 
     blank=True, 
     null=True 
    ) 
    charge_amount = models.DecimalField(
     max_digits=10, 
     decimal_places=2, 
     blank=True, 
     null=True 
    ) 


class Fee(models.Model): 
    shipment_item = models.ForeignKey('ShipmentItem', blank=True, null=True) 
    TAPING_FEE = 'taf' 
    TRANSPORTATION_FEE = 'trf' 
    OTHER = 'oth' 
    FEE_TYPE_CHOICES = { 
     (TAPING_FEE, 'Taping Fee'), 
     (TRANSPORTATION_FEE, 'Transportation Fee'), 
     (OTHER, 'Other'), 
    } 
    fee_type = models.CharField(
     max_length=3, 
     choices=FEE_TYPE_CHOICES, 
     blank=True, 
     null=True 
    ) 
    fee_currency_code = models.CharField(
     max_length=3, 
     blank=True, 
     null=True 
    ) 
    fee_amount = models.DecimalField(
     max_digits=10, 
     decimal_places=2, 
     blank=True, 
     null=True 
    ) 

客户端应用程序模型:

class Client(models.Model): 

    name = models.CharField(max_length=128) 
    code = models.CharField(
     max_length=16, 
     blank=True, 
     unique=True, 
     help_text="Example: 00042", 
    ) 
    slug = AutoSlugField(max_length=128, unique=True, populate_from='name') 

    INVOICE_LEVEL_PARENT = 'pa' 
    INVOICE_LEVEL_CHILD = 'ch' 

    INVOICE_LEVEL_CHOICES = { 
     (INVOICE_LEVEL_PARENT, 'Parent-level Invoice'), 
     (INVOICE_LEVEL_CHILD, 'Child-level Invoice'), 
    } 

    invoice_level = models.CharField(
     max_length=2, 
     choices=INVOICE_LEVEL_CHOICES, 
     default=INVOICE_LEVEL_PARENT, 
    ) 
    payment_terms = models.CharField(max_length=30, default='Net 15') 
    late_fees = models.DecimalField(default='1.50', max_digits=5, decimal_places=2) 

    notes = models.TextField(blank=True) 

    def __str__(self): 
     return self.name 
+1

这里添加您的模型代码。我认为你在字段中使用默认值作为动态。 –

+1

请显示修改实际正在进行的操作。 –

+1

同意 - 这可能是因为你的模型定义中有些事情是不确定的(动态的选择可能会在一分钟之间改变?一个datetime.datetime.now()调用某处?) – ryanmrubin

回答

2

choice参数应该是一个确定性迭代列表或元组

set在Python是随机3.3+和它不能是选择

变化

EVENT_TYPE_CHOICES = { 
    (SHIPMENT_EVENT, 'Shipment Event'), ... 
} 

EVENT_TYPE_CHOICES = (
    (SHIPMENT_EVENT, 'Shipment Event'), ... 
) 
-3

你将不得不做出新的迁移之前先迁移

./mange.py migrate

否则,它会继续比较当前数据库并创建新文件。

+1

不,它不会。 Django将模型中的定义与迁移文件进行比较,而不是db中的状态。 –