0

참조, 난과 같이 서로 참조하는 두 모델이 있습니다장고 내가 장고 1.6을 사용하고 서로

class Person(models.Model): 
    address = models.ForeignKey('Address', blank=False) 

class Address(models.Model): 
    person = models.ForeignKey(Person, blank=False) 

이유는 내가 가지고있는 순환 외래 키의 데이터 무결성을 위해입니다. 주소는 정확히 한 명의 사용자에게 할당 될 수 있으며 사용자는 하나 이상의 주소를 가져야합니다. 그리고 예, 나는 이것이 없이는 살 수 있다는 것을 압니다. 그러나 나는 그렇지 않을 것입니다.

외래 키 DEFERRABLE INITIALLY DEFERRED과 함께 PostgreSQL을 사용하고 있으며 트랜잭션을 사용하여 해당 테이블에 데이터를 삽입하려고합니다. 그러나 transaction.atomic():을 사용하려고하면 내보기에서 예상대로 작동하지 않습니다. 여기

내가 뭐하는 거지입니다 : 그러나

with transaction.atomic(): 
    addr = Address(street='125 fake street') 
    addr.save() 

    person = Person() 
    person.address_id = addr.id 

    addr.person_id = person.id 

    addr.save() 
    person.save() 

, 나는 IntegrityError을 받고 내가 잘못 제가 addr.save()

어떤 제안을 처음 호출을 유지? 거기에 더 좋은 방법이 있을까요?

답변

2

PostgreSQL은 NOT NULL을 확인하기 위해 트랜잭션의 끝까지 기다리지 않기 때문에 여기에 문제가 있습니다.

sql-set-constraints reference

"NULL과 행이 삽입되거나 (안 명령문의 끝에서) 수정 될 때 제약 조건은 항상 즉시 체크 확인하지."

그리고 내 열은 NOT NULL로 설정되었습니다. 해결 방법으로

, 나는이 날 데이터베이스에 삽입하고 나중에 외부 키를 업데이트하고 여전히 실패 할 수 있습니다이

with transaction.atomic(): 
    addr = Address() 
    addr.person_id = 0 # setting this temporarily to Zero 
    addr.save() 

    person = Person() 
    person.address_id = addr.id 
    person.save() 

    addr.person_id = person.id 
    addr.save() 

을하고 있어요 경우에는 외부 키가 일치하지 않습니다, 나는 결코 때문에 id 값에 대해 0의 값을 가짐.

+0

사람을 돌려 보내는 경우 템플릿 파일에서 사람 주소를 어떻게 알 수 있습니까? –