개체(Entity): 현실 세계에서 독립적으로 존재하는 것을 나타냅니다. 예를 들어, 학생, 교수, 과목 등이 개체가 될 수 있습니다.
속성(Attribute): 개체의 특성이나 속성을 나타냅니다. 예를 들어, 학생 개체의 속성으로는 학번, 이름, 전공 등이 있을 수 있습니다.
관계(Relationship): 개체들 간의 연관성이나 관계를 나타냅니다. 예를 들어, 학생과 과목 사이에는 '수강'이라는 관계가 있을 수 있습니다.
import django.db import models
adress = models.Charfiled(max_length=256, blank=False)
import django.db import models
class Aderess(models.Model):
si = models.CharFiled(max_length=32)
do = models.CharFiled(max_length=32)
gu = models.CharFiled(max_length=32)
detail = models.CharFiled(max_length=32)
class Member(models.Model):
teacher = models.ForeignKey(
to="Teacher",
on_delete=models.CASCADE,
related_name="members",
)
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
books = models.ManyToManyField('Book', related_name='authors')
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
# 위 코드에서 Author 모델과 Book 모델은 서로를 참조하고 있습니다.
# Author 모델은 Book 모델을 ManyToManyField로 참조하고 있고
# Book 모델은 Author 모델을 ForeignKey로 참조하고 있습니다.
# 에러 발생
# django.core.exceptions.FieldError: Invalid field name for ForeignKey 'author' on model 'Book': a model cannot have a field with the name 'author'.
# 이 에러는 순환 참조로 인해 발생하는 것으로, Book 모델에 있는 author 필드와 Author 모델 자체가 충돌하는 문제입니다.
원리
데이터베이스 스키마 생성: 장고는 모델 정의를 바탕으로 데이터베이스 스키마를 생성.
Author 모델은 Author_books라는 별도의 연결 테이블을 생성하여 Book 모델과 관계를 정의.
Book 모델은 author_id라는 외래 키를 사용하여 Author 모델과 관계를 정의.
순환 참조 문제: 위의 모델 정의에서 Author 모델의 books 필드와 Book 모델의 author 필드가 서로를 참조하고 있어, 데이터베이스 스키마 생성 과정에서 문제가 발생한다.
Book 모델의 author 필드가 Author 모델을 참조하려고 하면서 Author 모델의 books 필드와 충돌.
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField('Author', related_name='books')
class ParkingSpace(models.Model):
employee = models.OneToOneField(
to="Employee", null=True, on_delete=models.SET_NULL,
)
class Product(models.Model):
name = models.Charfiled(max_length='128', help_text='상품명')
class Meta:
db_table = 'product'
class OrderedProduct(models.Model):
"""주문된 상품들"""
order = models.FreignKey(to='Order', on_delete=models.CASCADE)
product = models.ForeignKey(to='Product', on_delete=models.CASCADE)
count = models.IntegerFiled(help_text='주문한 해당 상품의 개수', default=1)
class Order(models.Model):
# ...
product_set = models.ManyToManyField(to='Product', through='OrderdProduct')
class Meta:
db_table = 'orderz'
# help_text는 Django의 모델 필드에서 사용되는 옵션으로
# 관리자 페이지나 폼에서 해당 필드의 설명이나 도움말을 제공하는 데 사용
# through='OrderedProduct'은 Order 모델과 Product 모델 간의 ManyToMany 관계를 표현하는 데
#OrderedProduct 모델을 중간 테이블로 사용한다는 것을 의미.
# through 옵션을 사용하면, Order 모델에서 products라는 필드를 통해 여러 상품을 주문할 수 있으며
# 중간 테이블인 OrderedProduct를 통해 주문한 각 상품의 개수(count)를 관리할 수 있습니다.