2017-01-05 2 views
1

을 저장 업데이트 : 내가 명시 적으로 user.profile.save() 전화를해야이 방법으로사용자시 사용자 프로필은 내가 지금처럼, 내 사용자 모델을 확장하기 위해 <a href="https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#extending-the-existing-user-model" rel="nofollow noreferrer">'User profile'</a> 접근 방식을 다음있어

# models.py 
class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE, primary_key=True) 
    my_field = models.CharField(max_length=100) 

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

나에게 이는 투박한 느낌

# views.py 
def some_func(request): 
    user = User.objects.create_user('dummy', '[email protected]', '12345678') 
    user.profile.my_field = 'hello' 
    user.save()   # This does not persist the profile object... 
    user.profile.save() # ...this does 

이 문제를 해결하려면, 나는 다음에 create_user_profile()을 변경했습니다 작품 :

나는 profile이 환상을주고 원하는대로, User 객체의 일부입니다
# signals.py 
@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    profile = UserProfile.objects.get_or_create(user=instance) 
    profile.save() 

많은 경우 나는이 접근 방식을 사용하지 않았습니다. 이 방법을 사용할 때주의해야 할 사항이 있습니까?

답변

0

예, 몇 가지가 있습니다. 다음 상황에서는 post_save 신호가 발생하지 않습니다.

1이 저장 방법을 무시하고 슈퍼 클래스의 메소드를 호출하는 것을 잊지 때 성공적으로 당신이 MyModel.objects.update()

3를 호출 할 때

2 (예 : IntegrityError가 발생하는 경우와 같이) 개체를 저장하지 않는 방법을 저장하는 경우 .

4 신호 수신기가 성공적으로 등록되지 않은 경우.

이러한 경우 사용자 프로필이 저장되지 않습니다.

+0

, 같은주의 사항 첫 번째 방법에 대한 것 또한 사실이다. 나 맞아? – bavaza

+0

그러면 장면 활동 뒤에 의존하지 않고 명시 적으로 저장을 호출합니다. 그래서이 경고의 아무도는 정말로 중요하지 않다. – e4c5

+0

그러나 나는 post_save가 나쁜 접근이라는 것을 말하지 않고있다, 정말로 좋다. 네가 물었 기 때문에 나의 대답은 !! – e4c5

3

더 좋은 방법은 맞춤형 사용자 모델을 지정하는 것입니다.

from django.contrib.auth.models import AbstractUser 
from django.db import models 

class User(AbstractUser): 
    custom_field = models.ForeignKey(
     'contracts.Contract' 
    ) 
    ... 

    class Meta(AbstractUser.Meta): 
     swappable = 'AUTH_USER_MODEL' 

당신은 AUTH_USER_MODEL 속성을 정의하는 settings.py을 업데이트해야합니다 :

는 2 번 항목에서 제외
AUTH_USER_MODEL = 'app_name.User' 
+0

니스. 외부 키로'custom_field'가 필요한 이유는 무엇입니까? 커스텀'User' 객체에 char 필드를 정의 할 수는 없습니까? – bavaza

+0

가능합니다. 이것은 예제 필드 일뿐입니다. – SmoQ