2011-09-27 2 views
2

다음은 제거 된 모델 및 관련 메소드입니다. 난 모든 쿼리를 다시 쿼리하지 않고도 하나의 대답으로 필요한 모든 정보를 얻기 위해 쿼리를 실행할 때 간단한 방법을 찾고 있습니다. 여기에있는 도전은 value이며 value_id의 서명 여부에 달려 있습니다.Django QuerySets - 클래스 메소드가있는 경우

class Property(models.Model): 
    property_definition = models.ForeignKey(PropertyDefinition) 
    owner = models.IntegerField() 
    value_id = models.IntegerField() 

    def get_value(self): 
     if self.value_id < 0: return PropertyLong.objects.get(id=-self.value_id) 
     else: return PropertyShort.objects.get(id=self.value_id) 

는 지금 "값"을 얻기 위해 나는이 작업을 수행해야합니다

object = Property.objects.get(property_definition__name="foo") 
print object.get_value() 

누군가는이 문제를 해결하기 위해 깨끗한 방법을 제공 할 수 있거나 충분히 "좋은"인가? 이상적으로 나는 이것을 단순히하고 싶습니다.

object = Property.objects.get(property_definition__name="foo") 
object.value 

감사

+0

[일반 관계] (https://docs.djangoproject.com/en/1.3/ref/contrib/contenttypes/#generic-relations)를 사용 해본 적이 있습니까? –

+0

안녕 다니엘! 답장을 보내 주셔서 감사합니다. 문서를 읽을 때 (일반적으로) PositiveIntegerField를 사용해야한다고 나와 있습니다. 이 서명의 서명은 어떻게 처리합니까? – rh0dium

+0

글쎄요, 저의 요점은 긍정적/부정적 논리를 사용할 필요가 없다는 것입니다. 'content_type'을 사용하여 길고 짧은 속성을 구분할 수 있습니다. –

답변

1

이 나쁜 디자인 감안할. 자신의 메서드에 내장 된 property 데코레이터를 사용하여 속성으로 사용할 수 있습니다. Property.objects.get(pk=1).value

을하지만이 "청소기"전화로까지 갈 것 :

class Property(models.Model): 
    property_definition = models.ForeignKey(PropertyDefinition) 
    owner = models.IntegerField() 
    value_id = models.IntegerField() 

    @property 
    def value(self): 
     if self.value_id < 0: return PropertyLong.objects.get(id=-self.value_id) 
     else: return PropertyShort.objects.get(id=self.value_id) 

이것은 당신이 이상적으로 수행하고 싶은 일을 할 수 있도록한다. ;-)

django.models.Field을 확장하여 자신 만의 custom model field을 작성하여 API 뒤에 숨겨진 스키마를 숨길 수 있습니다. 적어도 지금 원하는 API를 제공하므로 나중을 나중에 마이그레이션 할 수 있습니다.

다른 사람이 언급 한 일반 키 또는 일반 키. 독을 선택하십시오 ...

1

이 나쁜 디자인입니다. Daniel Roseman이 말한 것처럼 동일한 필드에서 두 개의 다른 모델을 참조해야하는 경우 일반 외래 키를 살펴 봅니다.

https://docs.djangoproject.com/en/1.3/ref/contrib/contenttypes/#generic-relations

+0

나는 당신과 함께 해요! 이것은 내가 작동하도록 마사지하려고 노력하고있는 레거시 디자인입니다. Daniels가 'content_type'을 사용하여 두 속성을 구별하는 것에 대한 의견을 이해하지 못합니다. 그게 내가 원하는거야. – rh0dium

+0

에 내가 링크 된 문서로 말하면 콘텐츠 유형을 저장하는 테이블을 참조하는 외래 키를 생성하게됩니다. 그들은이 외래 키를 "generic"이라고 부른다. 이 외래 키와 동반해야하는 다른 보조 필드에는이 컨텐트 유형을 가진 객체의 ID가 포함됩니다. 길고 짧은 속성은 서로 다른 모델로 모델링되기 때문에 서로 다른 콘텐츠 유형을 갖습니다.이것은 보조 필드에 저장된 ID가 가리키는 테이블을 알 수있는 방법입니다. 개인적으로 두 개의 비 제네릭 외래 키 필드를 사용합니다. 각 속성마다 하나씩. – akonsu

관련 문제