[TIL]Djangoモデル


Django (models.py)
Djangoでは、データベースの設計に使用されるappディレクトリのmodelsです.pyファイルでは、すべてが実現されると言えます.
from django.db import models

# Create your models here.

class Menu(models.Model):
		name = models.CharField(max_length=20)
		class Meta:
			db_table = "Menus"


class Category(models.Model):
		name = models.CharField(max_length=20)
		menu = models.ForeignKey('Menu', on_delete=models.CASCADE)
		class Meta:
			db_table = "Categories"


class Drink(models.Model):
	korean_name = models.CharField(max_length=100)
	english_name = models.CharField(max_length=100)
	category = models.ForeignKey('Category', on_delete=models.CASCADE)
	description = models.TextField()

	class Meta:
		db_table = "Drinks"

class Allergy(models.Model):
	name = models.CharField(max_length=100)
    	drink = models.ManyToManyField('Drink', through='Allergy_drink')

	class Meta:
		db_table = "Allergies"




class Allergy_drink(models.Model):
	allergy = models.ForeignKey('Allergy', on_delete=models.CASCADE)
	drink = models.ForeignKey('Drink', on_delete=models.CASCADE)

	class Meta:
		db_table = "Allergy_drinks"



class Nutrition(models.Model):
	one_serving_kca = models.DecimalField(max_digits = 5, decimal_places = 2)
	sodium_mg = models.DecimalField(max_digits = 5, decimal_places = 2)
	saturated_fat_g = models.DecimalField(max_digits = 5, decimal_places = 2)
	sugars_g = models.DecimalField(max_digits = 5, decimal_places = 2)
	protein_g = models.DecimalField(max_digits = 5, decimal_places = 2)
	caffeine_mg = models.DecimalField(max_digits = 5, decimal_places = 2)
	drink = models.ForeignKey('Drink', on_delete=models.CASCADE)
	size_mi = models.CharField(max_length=20)
	size_fluid_ounce = models.CharField(max_length=20)

	class Meta:
		db_table = "Nutritions"


class Image(models.Model):
	image_url = models.CharField(max_length=500)
	drink = models.ForeignKey('Drink', on_delete=models.CASCADE)

	class Meta:
		db_table = "Images"
こんなモデルpyで作成されたクラスはDatabaseで作成されていると考えられます.ここでは、各入力値が何を意味するかは説明されません.Djangoを勉強したときに感じたのは、sql文法が分からなくてもPython文法を使ってデータベースを作成して管理できることです.
makemigrations、migrateコマンドはDjangoでデータベースを管理する重要なコマンドであり、この2つのコマンドはORMを可能にします.
ORMはオブジェクト関係マッピングの略で、韓国語ではオブジェクト-関係マッピングであり、オブジェクトが関係データベースに関連付けられる概念である.
オブジェクト向けにクラスの概念があり、リレーショナル・データベースにはテーブルの概念があります.
プログラミングにおいては、一般的にオブジェクト指向のパターンであり、リレーショナル・データベースを使用する際にオブジェクトの表示に拘束されず、オブジェクトを使用するように使用する技術と理解すればよい.
上記で宣言したクラスをデータベースにバインドしてテーブルにする場合は、manageを使用します.pyが存在するディレクトリでpythonを管理します.pymakemigrations「作成したアプリケーション名」を入力すると、モデルとしてmakemigrationsを実行します.pyでモデルを変更する事実(クラスの作成、変更、削除など).Djangoにmigrationとして保存したいと伝えます.ということで.
class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Category',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=20)),
            ],
            options={
                'db_table': 'Categories',
            },
        ),
        migrations.CreateModel(
            name='Menu',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=20)),
            ],
            options={
                'db_table': 'Menus',
            },
        ),
        migrations.CreateModel(
            name='Drink',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('korean_name', models.CharField(max_length=100)),
                ('english_name', models.CharField(max_length=100)),
                ('description', models.TextField()),
                ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.category')),
            ],
            options={
                'db_table': 'Drinks',
            },
        ),
        migrations.AddField(
            model_name='category',
            name='menu',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.menu'),
        ),
    ]
migrationsディレクトリが作成されます.上記のように、コードは自動的に生成されます.makemigrationsコマンドを入力したときにデータベースに適用されませんでした!
python manage.pymigrateを入力すると、上で生成したコードに基づいて自動的にsql構文に変換され、データベースに適用されます.テーブルが作成されます.
これにより、sql構文が分からなくてもmakemigrations、migrateでデータベースを制御できます.