Djangoにおけるカスタム移動の記述


Djangoの移行は、テーブルの歪みに変更を適用するアプリケーションのモデルから、自動生成されたファイルです.
新しいフィールドを追加したり、カスタムの移行を書く必要があるいくつかの変更を行うときにいくつかの状況があります.🤔
見ましょう.

問題


我々は、電子商取引アプリケーション販売靴やコンピュータを持っている.(とんでもない例だが,それはその仕事をするだろう😂)
データベースでは、次の2つのテーブルがあります.
from django.db import models


class Shoe(models.Model):
    name = models.CharField(max_length=100)
    brand = models.CharField(max_length=100)
    color = models.CharField(max_length=100)
    price = models.IntegerField()
    in_stock = models.BooleanField(default=True)
    description = models.TextField()
    image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.name

class Computer(models.Model):
    name = models.CharField(max_length=100)
    brand = models.CharField(max_length=100)
    color = models.CharField(max_length=100)
    price = models.IntegerField()
    in_stock = models.BooleanField(default=True)
    description = models.TextField()
    image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.name
我々にはComputer テーブルとShoe 基本的に同じフィールドを持つテーブル.これを改善し、乾燥を避ける方法はAbstractModel クラスだけでなく、その多くをカウントしないデータベースです.
クラスを作りましょうProduct それは同じ分野とproduct_type 製品の種類を知るフィールドcomputer or shoe .
class Product(models.Model):

    PRODUCT_TYPE_CHOICES = (
        ('shoe', 'shoe'),
        ('computer', 'shoe'),
    )

    name = models.CharField(max_length=100)
    brand = models.CharField(max_length=100)
    color = models.CharField(max_length=100)
    price = models.IntegerField()
    in_stock = models.BooleanField(default=True)
    description = models.TextField()
    image = models.ImageField(upload_to='images/')
    product_type = models.CharField(max_length=100, choices=PRODUCT_TYPE_CHOICES)

    def __str__(self):
        return self.name
製品クラスが作成されます.今何?あなたはおそらくpython manage.py makemigrationspython manage.py migrate データベース内の変更を適用するコマンド.
The Product 表が作成されますが、私たちもShoeComputer この新しいテーブルのテーブルデータは、それらを取り除くことができます.
これは、カスタムの移行を書く必要があります.
分離されたDjangoアプリケーションを作成したと仮定しますproduct Djangoプロジェクトでは、次のコマンドを使用して、新しい空の移行ファイルを生成できますproduct アプリケーション.
python manage.py makemigrations product --empty 
これに似たファイルがあります.
# Generated by Django 4.0.2 on 2022-04-03 10:36

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('product', '0001_initial'),
    ]

    operations = [
    ]
すごい!我々は今、インポートする必要がありますShoe and Computer モデルと移行する関数を書き込むShoe and Computer テーブルデータProduct 表.
def migrate_to_product_model(apps, schema_editor):
    Product = apps.get_model('product', 'Product')
    Shoes = apps.get_model('shoe', 'Shoes')
    Computer = apps.get_model('computer', 'Computer')

    for shoe in Shoes.objects.all():
        Product.objects.create(
            name=shoe.name,
            brand=shoe.brand,
            color=shoe.color,
            in_stock=shoe.in_stock,
            description=shoe.description,
            image=shoe.image,
            product_type="shoe"
        )

    for computer in Computer.objects.all():
        Product.objects.create(
            name=computer.name,
            brand=computer.brand,
            color=computer.color,
            in_stock=computer.in_stock,
            description=computer.description,
            image=computer.image,
            product_type="computer"
        )
そして最後の移行コードです.
# Generated by Django 4.0.2 on 2022-04-03 10:36

from django.db import migrations

def migrate_to_product_model(apps, schema_editor):
    Product = apps.get_model('product', 'Product')
    Shoes = apps.get_model('shoe', 'Shoes')
    Computer = apps.get_model('computer', 'Computer')

    for shoe in Shoes.objects.all():
        Product.objects.create(
            name=shoe.name,
            brand=shoe.brand,
            color=shoe.color,
            in_stock=shoe.in_stock,
            description=shoe.description,
            image=shoe.image,
            product_type="shoe"
        )

    for computer in Computer.objects.all():
        Product.objects.create(
            name=computer.name,
            brand=computer.brand,
            color=computer.color,
            in_stock=computer.in_stock,
            description=computer.description,
            image=computer.image,
            product_type="computer"
        )


class Migration(migrations.Migration):

    dependencies = [
        ('product', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(migrate_to_product_model)
    ]
これはカスタムマイグレーションの例です.移動が失敗し、データベースが失敗した場合について心配する必要はありません.移行トランザクションはデフォルトでアトミックです、そして、何かが南に行くならば、変化はデータベースに委託されません.
🚀
より多くの読書のために、チェックしてくださいofficial documentation of migrations インジャンゴ.
記事投稿bloggu.io . 無料でお試しください.