2013-04-22 1 views
0

장고 등록 및 신호를 사용하는 데 약간 문제가 있습니다. 기본 설정은 django 1.4.3 설치가 장고 - 남쪽 및 장고 등록 (그리고 db는 SQLite로 가치가 있음)입니다.OneToOne 일부 ID 문제를 일으키는 사용자의 필드

편집 : 질문이 변경되었습니다. 쉘에서 효과가 동일하므로 등록이 원인이 아닙니다 (편집 내용은 이탤릭체로 표시됨).

나는 다음과 같은 방법으로 사용자 모델과 관련이 내 모델의 하나가 :

class MyUserProfile(models.Model): 
    user = models.OneToOneFiled(User) 
    #additional fields 

내가 남쪽을 사용하여베이스를 초기화. 내가에 있어야 SQL을 확인 sqlall 조금을, 나는 명확하게 볼 수 있습니다 : 그 후

CREATE TABLE "myApp_myuserprofile" (
    "id" integer NOT NULL PRIMARY KEY 
    "user_id" integer NOT NULL UNIQUE REFERENCES "auth_user" ("id"), 
    #other fields 
) 

를, I는 사용자가 계정을 활성화하면 데이터를 초기화하고 싶었다. 그래서 models.py에서 나는 거기에 생각하지만, 모든 것이 괜찮아 보인다

from django.dispatch import receiver 
from registration.signals import user_activated 
#Models.... 
@receiver(user_activated) 
def createMyProfile(sender, **kwargs): 
    currentUser = kwargs['user'] 
    profile = Profile(user = currentUser, #other fields default value) 
    profile.save() 
    #And now the reverse relation: 
    currentUser.myuserprofile = profile 
    currentUser.save() 

을 넣어 나는 (사용자와 프로파일 모두) ID를 인쇄하고 있다면 앞뒤로 두 사이에 여행하는 경우 , 나는 틀린 것처럼 보이는 것을 본다.

코드의이 부분을 비활성화하고 쉘을 사용하여 같은 종류의 초기화를 수행하면 동일한 결과가 나타납니다.

하지만 그 후에는 모든 것이 틀립니다. 내가 쉘을 열고 관련 문제를 가져 오는 경우 , 나는 모든 X 값

MyUserProfile.objects.get(pk=X) 
#DoesNotExist Exception 
User.objects.get(pk=X).myuserprofile.pk 
1 
MyUserProfile.objects.all()[X].pk 
1 

에 대해 다음 한없이 좀 이상한 것 같은데?

는 그리고 지금은 SQL 쉘

select id from myApp_myuserprofile; 
1 
1 
1 
1 
... 

에 가면 그래서 사방에 같은 값으로 가득 차 열 수 있습니다. 어느 쪽이 당연한 말인가? 당황 스럽다. (모두가 같은 이드를 가진 프로필을 가지고 있기 때문에 문제를 일으킨다.)

문제의 원인이 될 수있는 아이디어와 해결 방법은 무엇입니까?

P.S : 관련 관계의 외래 키가 정확하고 고유성이 유지된다는 점에 유의하십시오.

답변

0

실제로 SQLite와 South의 사용으로 인한 문제인 것 같습니다.

SQLite는 기본적 전혀 훨씬 스키마 변질을 지원하지 않지만, 한국은 열 삭제/변질을 허용하는 해결 방법을 가지고 있음을

doc 상태. 그러나 고유 색인은 여전히 ​​지원되지 않습니다. South는 그러한 명령을 자동으로 무시합니다.

처음부터이 관계를 만들지 않았지만 후자의 마이그레이션으로이 상황을 만들었으므로 (나는 생각합니다.) 어느 경우에 해당 했습니까? 방금 기본 및 마이그레이션을 재설정하고 보았습니다.

마이그레이션의 경우 What's the recommended approach to resetting migration history using Django South?, 기본 재설정의 경우 간단 ./manage.py reset myApp을 참조하십시오.