custom model 을 공부하는 중에 궁금한점이 있어서 질문 드립니다. 현재 djan

 
서대원

custom model 을 공부하는 중에 궁금한점이 있어서 질문 드립니다.
현재 django auth User와 one to one관계를 갖는 profile 모델을 만들어서
회원가입폼을 만들려고 시도하고 있습니다.

1. auth User 와 Profile모델간의 one to one관계를 가질때 기존의 User 모델에 있는 username과 같은 필드를 Profile안에도 선언하는 것이 비효율적인 것인가요? 아니면 불가능한것인가요??

2. modelform을 통해서 form을 만들때, meta 속성부분의 model 명을 User로 해주는 것이 맞나요? Profile로 해주는 것이 맞나요?(제가 One to one 관계에 대해 정확히 이해 못한것 같습니다.ㅜ)

3. 그렇다면 위와 같이 회원가입폼을 만들때 아래의 메서드를 통해서 아이디의 존재여부와 비밀여부 일치 여부를 확인할때, 모델의 객체를 불러오려면 User에서 Profile의 값을 어떻게 불러와야하는것인가요? 아래사진과 같이 바로 Profile모델의 객체를 불러와서 확인하면 되는 것인가요?

  • 신영원

    3번) 저는 len(Profile.objects.filter(username=username))>0 이런식으로 하니깐 중복체크는 잘되더라고요

    신영원

    커스텀유저는 one to one으로 만들기보다 AbstractBaseUser 상속받아서 기본 유저모델처럼 쓰는게 더 일반적인방법인거같네요

    Enoch Lee

    1. 기존 User모델을 Profile과 OneToOne 관계로 지정하신다면 User모델에 정의되어있는 부분을 다시 정의하실 필요가 없습니다.
    2. forms.ModelForm을 상속하시는 것보다 UserCreationForm을 상속하신후,save()를 override하여 Profile정보를 저장하시면 됩니다. 하지만 Profile모델생성자체는 User모델 생성시 자동생성되도록 signal을 이용하시는 것이 좋을것 같습니다.
    3. UserCreationForm을 상속하시게 되면 아이디중복,비밀번호 일치와 관련된 체크는 자동으로 진행됩니다.

    https://docs.djangoproject.com/en/1.8/topics/auth/default/#module-django.contrib.auth.forms
    Built-in Forms부분을 읽어보시면 더 자세히 보실수 있습니다.

    Chinseok Lee

    모델 필드에서 unique=True 로 지정이 되고 ModelForm 을 통해 필드가 지정이 되면, 그 form field 의 validators 에서 unique 체크를 해줍니다.

    —-

    직접 unique 체크시에 len(Profile.objects.filter(username=username)) > 0 와 같이 하시기보다, queryset 의 exists 를 쓰시는 것이 효율적입니다.

    Project.objects.filter(username=username).exists()

    https://docs.djangoproject.com/en/1.8/ref/models/querysets/#exists

    Chinseok Lee

    그리고, django/contrib/auth/forms.py 의 UserCreationForm 의 코드를 참고해보세요.

    https://github.com/django/django/blob/master/django/contrib/auth/forms.py#L63

    서대원

    신영원 답변감사합니다~~

    서대원

    이에녹 말씀해주신거참고해서해보겠습니다 감사합니다!

    서대원

    이진석 항삼도움주셔서감사합니다:)

    Jun-young Park

    이진석 좋은정보 감사합니다.

    Minjae Lee

    이진석 항상 좋은 정보 감사합니다.

    Youngsoo Jung

    또는 betterforms 를 사용하는 것도 좋은 고려할 수 있는 괜찮은 방법입니다.

    http://django-betterforms.readthedocs.org/en/latest/multiform.html

    Donghyun Cho

    1. 같은 정보를 두 모델에 저장하는 것은 가능하지만 불필요합니다. 유저 모델에 프로파일 모델을 일대일로 매핑하는 이유는 유저에 대한 추가정보를 저장하기 위해서 사용합니다. 유저 모델에 직접 필드들을 넣어도 되겠지만 자주 사용하는 필드들을 제외하곤 나누는 것이 성능향상에 도움이 됩니다. 디비 모델링 시 한 모델 즉 테이블에 필드의 개수는 15-20개 내외로 유지하는 것이 좋습니다. 필드 크기와 기타 여건에 따라 달라지겠지만요. 유저와 같이 페이지마다 사용되어지는 모델은 특히 조심스럽겠죠.
    2. 하나의 폼에서 두 개의 모델을 사용할 수 있습니다. prefix로 모델을 구분해서 사용하긴 하는데.. 유저와 프로파일 모델과 같은 일대일 관계에는 좀 복잡하지만 시간되면 예제 하나 드리겠습니다.
    3. @Chinseok Lee 님께서 말씀하신 exists()가 좋은 방법입니다.
    len() 는 결과물을 직접 메모리에 로드해서 갯수를 세기 때문에 좋은 방법이 아닙니다. 결과물이 많은 경우 메모리 사용량이 증가하게 되요. 갯수를 셀 경우엔 count()를 사용하세요.

    번외로
    try:
    entry = Entry.objects.get(pk=1)
    except Entry.DoesNotExist:
    # 예외처리
    이렇게도 사용하실 수 있습니다.

    Donghyun Cho

    코멘트 작성하고 스크린샷을 봤는데 유저 모델을 직접 커스터마이징 하시려면 abstractBaseUser모델을 상속받아서 사용하실수도 있습니다.
    Django custom user model로 검색하시면 쉽게 찾아보실 수 있을꺼에요.

    서대원

    Youngsoo Jung 답변 너무나 감사드립니다~ 다양한 폼 종류가 존재하군요^^ 참고해서 공부해보겠습니다.

    서대원

    Donghyun Cho 친절한 답변 감사합니다~ 말씀해주신대로 공부해보겠습니다. onetoone모델로 만들었던 것은 abstractBaseUser모델 상속받는것으로 변경해보아야겠습니다^^

Advertisements