Document | 4 Many to one recursive
https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.ForeignKey.on_delete
models.py
class Manufacturer(models.Model):
name = models.CharField('제조사원', max_length=20)
def __str__(self):
return self.name
class Car(models.Model):
# ForeignKey를 선언한 모델은 Many-to-one에서의 'one'에 해당
# 여러개의 Car는 하나의 Manufacturer에 연결될 수 있다
# (Car하나는 하나의 Manufacturer밖에 갖지 못함)
# 반대로, Many에 해당하는 Manufacturer는, 자신에게 연결된 Car를 개수 제한없이 가질 수 있다.
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
name = models.CharField('차량명', max_length=100)
def __str__(self):
return self.name
제조사가 지워진다면 연결되어져 있는 자동차에 대해서 어떤 action을 할 것인가? (즉, Many-to-One에서 One(상위개념)이 지워질 경우)
ex)
models ForeignKey 옵션
on_delete=
models.ForeignKey('self', on_delete=models.CASCADE)
PROTECT
models.ForeignKey('self', on_delete=models.PROTECT)
Manufacturer쪽에 Car가 한개라도 연결되어 있으면 못 지우도록 함
SET_NULL
models.ForeignKey('self', on_delete=models.CASCADE, null=True)
Manufacturer쪽이 지워지면 Car.manufacturer = NULL 설정
null=True 안에 꼭 넣어줘야 합니다.
SET_DEFAULT
models.ForeignKey('self', on_delete=models.CASCADE)
Manufacturer쪽이 지워지면 기본 값을 지정(default="망한 제조사의 차") default 모델 지정 해야함
SET
models.ForeignKey('self', on_delete=models.CASCADE)
Customizing 해서 모델을 지정함
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
def get_sentinel_user():
return get_user_model().objects.get_or_create(username='deleted')[0]
class MyModel(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET(get_sentinel_user),
)
leader가 없어져도 스터디원들은 남아있어야 함
(다른 leader를 세우면 됨 => SET_NULL 설정)
from django.db import models
class StudyUser(models.Model):
leader = models.ForeignKey(
'self', on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=20)
def __str__(self):
return self.name
SystemCheckError: System check identified some issues:
ERRORS:
many_to_one.User.leader: (fields.E320) Field specifies on_delete=SET_NULL, but cannot be null. HINT: Set null=True argument on the field, or change the on_delete rule.
Car.manufacturer = NULL 설정 필수!!
null=True 안에 꼭 넣어줘야 합니다.
related_name=
FK가 걸려 있는 하위 개념의 모델에 걸 경우 하위모델_set 으로 설정
역 참조 할 때 사용한다.
menufacture = Manufacturer.objects.create(name='기아')
ll = list()
for car in ['k5', 'k3', 'k7']:
car, _ = Car.objects.get_or_create(name=car,manufacturer= menufacture)
ll.append(car)
manufacturer.car_set.all()