2017-10-25 18 views
0

기본 Django 사용자 모델과 연결된 프로필 모델을 성공적으로 만들었지 만 프로필로 데이터를 저장하는 데 문제가 있습니다. 사용자를 만들려고하면 기본 사용자가 요청의 데이터로 만들어 지지만 프로필 모델은 비어있게됩니다. 채워지는 유일한 필드는 사용자에게 알리는 ID와 FK입니다.Django 사용자 프로필 모델 저장 안함

HELP!

모델 :

class StudentProfile(models.Model): 
     user = models.OneToOneField(User, unique=True) 
     address = models.CharField(max_length=100, null=True, blank=True) 
     classroom = models.ForeignKey(Class, null=True, blank=True, 
       related_name='classes', on_delete=models.CASCADE) 
     birth = models.CharField(max_length=10, null=True, blank=True) 
     isStudent = models.BooleanField(default=True) 

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

     @receiver(post_save, sender=User) 
     def save_user_profile(sender, instance, **kwargs): 
      instance.profile.save() 

창조 방법 : 사용한다, 그래서

user, created = User.objects.create_user(username=request.POST['username'], email=None, 
                password=request.POST['password'], is_staff=True) 

      student = StudentProfile.objects.last()   
      student.address = request.POST['address'] 
      student.birth = request.POST['birth'] 
      student.classroom = request.POST['class'] 
      student.save() 

답변

0

User.objects.create_user(...) 다만, 사용자 (https://docs.djangoproject.com/en/1.11/ref/contrib/auth/#django.contrib.auth.models.UserManager.create_user),하지 튜플을 반환

user = User.objects.create_user(
    username=request.POST['username'], 
    email=None, 
    password=request.POST['password'], 
    is_staff=True 
) 

또한 코드의 두 번째 섹션을 개선하기 위해 아마도 사용하지 말아야합니다. .last()가 StudentProfile를 선택 :

student = StudentProfile.objects.create(
    user=user, 
    address=request.POST['address'], 
    birth=request.POST['birth'], 
    classroom=request.POST['class'] 
) 

두 사람이 시스템을 사용하고 둘 다 동시에 StudentProfile을 만든 경우, 당신은 볼 것입니다 무슨 일이 것은 :

  1. StudentProfile A가 만든
  2. StudentProfile B 생성
  3. StudentProfile B가 선택되고 StudentProfile A로 업데이트되었습니다.
  4. StudentProfile B가 선택되어 StudentProfile B로 업데이트되었습니다. 의

StudentProfile (B)가 또한 작업의 순서에 따라 StudentProfile A의 세부 사항을 갱신 할 수있다,이 데이터베이스와 경쟁 조건이 유사하고 부하가 아주 ​​나쁜 것입니다.

+1

미리 감사드립니다. 코드가 잘못되어 방금 편집했습니다. 프로파일 생성은 여기서 일어나지 않습니다. 그것은 절망의 시도였습니다. 그것은 StudentProfile 클래스에서 발생합니다. – Blackk

+0

아, 여러분은'profile, created = StudentProfile.objects.get_or_create (user = user)'를 사용하여 시도해 볼 수 있습니다. 그러나 이것은 신호를 버그 아웃시킬 수 있습니다. 따라서' create_user_profile' 메서드 – ARJMP

+0

또한 경쟁 조건이 여전히 나타납니다. 두 명의 사용자가 동시에 생성되면 둘 다 동일한 시간에 학생 프로파일을 작성하며 두 학생 모두 동일한 StudentProfile을 선택하고 업데이트 할 수 있습니다. – ARJMP