본문 바로가기

web/Django

django models.OneToOneField는 변경할때 생성이 됩니다.

다른 프레임워크를 하다가 다시  django를 하다가 당혹스러운 경험입니다. 

 

django의 models.OneToOneField는 데이터가 default시 (데이터 변경이 없다면) 해당 row가 생성되지 않습니다. 

 

해당 이미지는 예제 입니다. (django의 user는 위와 같지 않습니다.)

위와 같은 관계를 가질때  보통 user를 생성하면 user_profile도 디폴트로 생성됩니다. (보통의 orm에선 말이죠..)

하지만 django에서는 디폴트로 생성되지 않습니다!!!!!! 생성시 profile의 데이터를 변경하면 그때 생성됩니다. 

만일 디폴트로 생성후 profile이 없는 상태에서 profile에 참조하게 된다면?? 에러가 터지죠. (저와 같이 말이죠.. 머리도 터집니다.)

 

넵 방법은 있습니다. 

 

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

 

위의 방법처럼  @receiver로 user가 생성할 때 마다 하는 참조하는 방법은 절대 쓰지 마세요!!!!

나중에 더 터집니다.

 

 

django-annoying 패지키의 AutoOneToOneField으로 필드 속성을 바꿔주세요.

from annoying.fields import AutoOneToOneField

class MyProfile(models.Model):
    user = AutoOneToOneField(User, primary_key=True)
    home_page = models.URLField(max_length=255)
    icq = models.CharField(max_length=255)

https://stackoverflow.com/questions/1652550/can-django-automatically-create-a-related-one-to-one-model

 

Can Django automatically create a related one-to-one model?

I have two models in different apps: modelA and modelB. They have a one-to-one relationship. Is there a way django can automatically create and save ModelB when modelA is saved? class ModelA(mod...

stackoverflow.com

 

기존 필드라면 마이그레이션도 해주셔야합니다.

 

그러면 마찬가지로 default상태일때는 똑같이 생성이 되지 않지만, 참조시 자동으로 생성됩니다.!!( 그래서 에러가 나지 않습니다.)

 

혹시나 필수값을 받지 않는 상태의 row이며,  OneToOneField일 경우엔 annoying를 쓰세요.

 

그래야 미래의 내가 편해집니다.

'web > Django' 카테고리의 다른 글

django migrate 칼럼이 생성 안될때 ( 꼬였을때)  (0) 2019.08.09
EFK docker + django logger 커스텀  (0) 2019.07.21
nginx + uwsgi 연동  (0) 2019.01.11
uwsgi -- unavailable modifier requested: 0 --  (0) 2019.01.10
ubuntu uwsgi  (0) 2019.01.10