Django 3


次に、onetomanymanytoonemanytomany関係、およびForeignKeyについて説明する.

ForeignKey with ManyToOne Field

외래키(Foreign Key)は表のフィールドであり、他の表の行と識別できるキーを示す.
次の表は、カラムを追加しすぎて効率が低下した構造です.

カラムとデータのクエリーに時間がかかる場合があります.そこで、2つのテーブルに分けて、次のように接続リングを作成します.


要するに、2つのテーブルを接続できるのはForeign Keyの役割です.
class Room(core_models.TimeStampedModel):
	host = models.ForeignKey(
        "users.User", related_name="rooms", on_delete=models.CASCADE, null=True
    )
    room_type = models.ForeignKey(
        "RoomType", related_name="rooms", on_delete=models.SET_NULL, null=True
    )
外部キーを作成するときに必要なパラメータには、参照するテーブル、オブジェクト関係の名前、およびオブジェクトを削除するときに実行するアクションが含まれます.
参照するテーブルは、外部キーからどのテーブルを参照するかを示します.例では、ユーザフォルダのUserテーブル、RoomTypeテーブルを示します.
オブジェクト関係に使用される名前(related name)とは、抽象モデルで関係を定義するときに使用される名前です.例では、これは部屋です.
オブジェクトを削除するときに実行するアクション(on delete)は、「ForeignKey」が表示するテーブルの値が削除されたときに実行するアクションを指定します.例えば、ユーザが削除された場合、残りの部屋を削除するか、エラーを解放して部屋を保護するかなどである.

これは、あなたとManyToOne(다대일 관계)のオブジェクトにのみ適用されます.

ManyToMany Field


次のコードはManyToManyフィールドで、複数のタイプを複数の部屋に接続できます.
class Amenity(AbstractItem):
    class Meta:
        verbose_name_plural = "Amenities"
        
class Facility(AbstractItem):
    class Meta:
    	#abstract = True
        verbose_name_plural = "Facilities"

class HouseRule(AbstractItem):
    class Meta:
        verbose_name = "House Rule"
class Room(core_models.TimeStampedModel):
    amenities = models.ManyToManyField("Amenity", related_name="rooms", blank=True)
    facilities = models.ManyToManyField("Facility", related_name="rooms", blank=True)
    house_rules = models.ManyToManyField("HouseRule", related_name="rooms", blank=True)
この関係では、2つのモデルのいずれかを宣言できます.blank=Trueオプションを選択したのは、オプションを指定しないからです.
また、meta classはクラス内のクラスであり、verbose name(複数)、orderなどを指定できます.abstract=trueはモデルですが、データベースには表示されません.

OneToOne Field

OneToOneFieldは1:1の関係を表す.
class User(AbstractBaseUser):
  # 생략

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
上記のコードは、djangoでデフォルトで定義されているユーザーモデルを、新しく作成したProfileモデルに関連付けます.