2017-10-10 133 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中的狀態。 –