2017-10-10 3 views
1

Djangoは同じマイグレーションを呼び出すときに繰り返しファイル作成されmakemigrationsで作成された: Djangoの移行:同じ移行は

./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

それ以外の場合は、現在のdbと比較して新しいファイルを作成します。

+1

いいえ、そうではありません。 Djangoはモデル内の定義をdb内の状態ではなく、マイグレーションファイルと比較します。 –