2009-08-27 8 views
3

사용자 주소가있는 모델이 있습니다. 이 모델은 수신자 (예 : 회사 등)에게 주소를 설정하기 때문에 first_name 및 last_name 필드가 있어야합니다. 내가 달성하기 위해 노력하고있어입니다 : 주소에서 fist_name/LAST_NAME 필드가 작성되는 경우장고 빈 필드 대체물

  • - 주소에서 fist_name/LAST_NAME 필드가 비어있는 경우 해당 필드를 단순히
  • 을 반환 - 필드 데이터를 corrresponding 가져 적절한 django.auth.models.User를 가리키는 외래에서.
  • 필드 검색에 표시되는 정상적인 장고 필드로 취급하고 싶습니다.
  • 나는 방법을 만들고 싶지 않습니다. 그것은 리팩토링이고 Address.first_name/last_name은 응용 프로그램의 여러 위치 (모델 양식 등에서도 사용됩니다.)에서 po와 같이 부드럽게 처리해야합니다. ssible 그렇지 않으면 나는 많은 장소에서 주변에 도움을

감사합니다 :)

답변

5

여기에 두 가지 옵션이 있습니다를 수리를해야합니다. 첫 번째 방법은 동적으로 검색하는 메서드를 만드는 것이지만 property 데코레이터를 사용하여 다른 코드에서도 직선 특성 액세스를 계속 사용할 수 있도록합니다.

class MyModel(models.Model): 
    _first_name = models.CharField(max_length=100, db_column='first_name') 

    @property 
    def first_name(self): 
     return self._first_name or self.user.first_name 

    @first_name.setter 
    def first_name(self, value): 
     self._first_name = value 

관련 User가 변경된 경우에도 항상 first_name의 최신 값을 참조합니다. 당신은/얻을 당신은 속성와 정확히 일치 속성을 설정할 수 있습니다 :

def save(self, *args, **kwargs): 
    if not self.first_name: 
     self.first_name = self.user.first_name 
    # now call the default save() method 
    super(MyModel, self).save(*args, **kwargs) 

이 방법은 당신이 돈을 : myinstance.first_name = 'daniel'

다른 옵션은이 조회가 저장 않는 경우 있도록 모델의 save() 메소드를 오버라이드 (override)하는 것입니다 데이터베이스를 변경해야하지만 저장시에만 새로 고침됩니다. 따라서 관련 User 객체는 변경되었지만이 객체는 변경되지 않으면 이전 User 값을 참조합니다.

+0

스키마 변경을 막기 위해 db_column = 'first_name'을 지정할 수 있습니다. http://docs.djangoproject.com/en/dev/ref/models/fields/#db-column –

+0

@ first_name.setter 그냥 first_name.db_column = "first_name"을 추가 하시겠습니까? 내가 할 수있을 것입니다 : address = Address.objects.get (first_name = "blah")? – pielgrzym

+0

piquadrat의 의견에 대한 응답으로 코드와 설명을 업데이트했습니다. –