Django Model Documen

dooh kim·2020년 8월 21일
0

django-model-document

목록 보기
2/7

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)

  • Post(one) - comment(many)
  • User(one) - UserImage(many)

models ForeignKey 옵션

on_delete=

  • CASCADE
    models.ForeignKey('self', on_delete=models.CASCADE)
    제조사 밑에 있는 모든 Car table을 모두 지워버림
  • 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()



profile
testify to the light

0개의 댓글