Djangoにおけるカスタム移動の記述
Djangoの移行は、テーブルの歪みに変更を適用するアプリケーションのモデルから、自動生成されたファイルです.
新しいフィールドを追加したり、カスタムの移行を書く必要があるいくつかの変更を行うときにいくつかの状況があります.🤔
見ましょう.
我々は、電子商取引アプリケーション販売靴やコンピュータを持っている.(とんでもない例だが,それはその仕事をするだろう😂)
データベースでは、次の2つのテーブルがあります.
クラスを作りましょう
The
これは、カスタムの移行を書く必要があります.
分離されたDjangoアプリケーションを作成したと仮定します
🚀
より多くの読書のために、チェックしてくださいofficial documentation of migrations インジャンゴ.
記事投稿bloggu.io . 無料でお試しください.
新しいフィールドを追加したり、カスタムの移行を書く必要があるいくつかの変更を行うときにいくつかの状況があります.🤔
見ましょう.
問題
我々は、電子商取引アプリケーション販売靴やコンピュータを持っている.(とんでもない例だが,それはその仕事をするだろう😂)
データベースでは、次の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 makemigrations
とpython manage.py migrate
データベース内の変更を適用するコマンド.The
Product
表が作成されますが、私たちもShoe
とComputer
この新しいテーブルのテーブルデータは、それらを取り除くことができます.これは、カスタムの移行を書く必要があります.
分離された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 . 無料でお試しください.
Reference
この問題について(Djangoにおけるカスタム移動の記述), 我々は、より多くの情報をここで見つけました https://dev.to/koladev/writing-custom-migrations-in-django-3eliテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol