2009-07-25 2 views
2

예를 들어 모델의 게시물과 댓글이 있습니다.주석을 달기 위해 모델에 필드를 추가하십시오.

Post.objects.annotate(Count('comment')) 

모든 게시물에 대한 의견 개수를 얻기 위해 이러한 쿼리를 작성합니다. 그러나 템플릿에서 나는이 값이 4보다 큰지 확인해야합니다. 제가 알기로 그런 templatetag는 없습니다. 지금은 비교 연산을 수행하는 모델에 메소드를 넣습니다.

문제는 주석을 모델로 필드를 두는 방법입니까?

답변

1

모델은 단지 클래스이며, Python 클래스 인스턴스는 동적입니다. 즉, 원하는 속성을 인스턴스에 할당하기 만하면 인스턴스에 추가 할 수 있습니다.

myinstance = MyModel.objects.get(pk=1) 
myinstance.mycomparisonattribute = True 

그러나 비교 방법을 사용하는 것보다 더 좋은 이유는 없습니다. 또는 비교할 수있는 맞춤 템플릿 태그를 사용하십시오. SmileyChris의 smart if 태그는 우수합니다.

+0

맞아, 내 실수를 이해했다. 대신 myinstance.my 비교 속성 - myinstance [ 'mycomparisonattribute']를 씁니다. –

0

당신은 사용자 정의 Manager 아마 사용하여 그것을 시도 할 수 있습니다, 당신은

0

추가 할 수있는 여러 가지 방법과 클래스에 추가 속성이 있습니다 here 설명 된대로, 오버라이드 (override) get_query_set() 방법으로 사용자 정의 관리자를 만들려고합니다. 한 번만 계산할 수 있고 그 이후부터 읽기 전용으로 사용할 수있는 속성 인 경우 속성 꾸미기을 사용하는 것이 좋습니다. 예를 들어

: 그것은 시간이 지남에 따라 변화되기 때문에

@property 
def foo(self): 
    bar = do_some_calculation() 
    return bar 

하지만, 당신은 객체의 특정 유형의 수를 확인하고 싶은 경우에 가능하지 않습니다.

관리자 기능을 사용하여 개체 집합을 반환해야합니다. 당신이 게시물에 4 개 이상의 의견을 가지고 있는지 여부를 나타내는 부울 값을 반환하려는 경우, 당신은 모델에 기능을 추가 할 수 있습니다

def more_than_4_replies(self): 
    return self.objects.count() > 4 

그리고 당신은 또한 당신이 템플릿에 통과 설정 오브젝트에 주석을 집계을 사용할 수 있습니다 smart-if 또는 pyif과 같이 향상된 if 태그를 사용하십시오.