2012-03-30 1 views
3

나는 다음과 같습니다 장고 모델을하고 있어요 :존재하지 않는 개체를 생성하는 OneToOneField를 만들 수 있습니까?

입니다
class Subscription(models.Model): 
    user = models.OneToOneField(User) 

, 그것은 장고의 auth 모듈에서 User 클래스와 one-to-one 연관이있다. 이 연결은 선택 사항이 아닙니다.

sub = user.subscription 

DoesNotExist 예외가 발생합니다 :하지만, 덕분에 일부 레거시 코드와 데이터베이스와의 몇 가지 수동 땜질로, 같은 그 코드를 의미 관련된 구독, 한 사용자가 하지 않는 경우가 있습니다 . 그러나 대부분의 코드베이스에서는 모든 사용자가 연관된 Subscription 객체를 가지고 있다고 가정합니다.

나는 서브 클래스 수있는 방법이 있나요 OneToOneField 관련 Subscription 개체가 데이터베이스에 존재하지 않는 경우, 내가 하나를 만들고 user.subscription를 호출 할 때, 예외 상황을 던지는 대신의 반환합니다 있도록?

답변

1

올바른 방법은 post_save 신호를 잡아서 필요한 경우 개체를 만드는 것입니다.

+0

이 대부분 (기존) '사용자가 기존에 대해 발생하면 그냥 DB를 수정 코드를 리팩토링 및 사용자

  • 에 대한 proxy model를 추가 '때문에,'post_save' 신호는 반드시 관련된'subscription' 객체를 역 참조하기 전에 해고 될 필요는 없습니다. – mipadi

  • +1

    단일 쿼리로 모든 레거시 사용자를 처리 할 수 ​​있습니다. –

    0

    subscription라는 속성을 추가하고 getter에 당신이 원숭이 패치 작업을 수행 할 수 있습니다에 대한 더 나은 대안이

    1. 을하고, 필요한 참조를 만들 코드를 리팩토링 및 구독
    2. 을 얻을 수있는 유틸리티 함수를 추가
    관련 문제