2014-03-05 4 views
1

1.6 장고 자습서에서 테스트에 대해 말한 후에 Choice (이 모델에는 외래 키)이 없을 때 index.html보기로 볼 수없는 Poll을 볼 수 있습니다. 필터 만 저장 뭐죠에 적용 할 수 있기 때문에 나는이 도움이되지 밝혀졌다 polls/model.pydjango 모델 유효성 검사를 제외한 제외 항목

def has_choices(self): 
    if self.choice_set.count() == 0: 
     return False 
    else: 
     return True 

에 (...이 도움이 될 것으로 기대에서) 간단이를 확인 할 수 있도록 모델을 업데이트했습니다 데이터베이스에서 함수는 이 아니고이 아닙니다. 그래서 잠재적으로 유효성 검사 규칙을 만들려고 했으므로 Poll 객체가 저장 될 때마다 새로운 부울 객체 (model.BooleanField)를 업데이트 할 것이므로이 쿼리에 사용할 데이터 열이있었습니다. 그러나, 그때 나에게 발생했습니다 그 Choice 개체가 저장됩니다, 아니 실제로는 선택을 추가했다 Poll 개체.

이 모든 것은, 내 poll/view.py에 필터를 추가하는 방법을 생각해 볼 수 없습니다. 나는 Poll.objects.exclude(....이 작동 할 것이라고 생각했지만 그때 그 결과에 매핑 된 외래 키가없는 Choices에 대한 쿼리에 참여하는 것이 복잡해졌습니다.

을 복잡하게하는 이상입니까? 아니면 이에 대한 우아한 해결책이 있습니까? 이 튜토리얼은 매우 쉬워 보였지만 1.6 용 튜토리얼보다 훨씬 복잡한 연습 문제를 겪고 있습니다.

모든 답변이 작동하지만 우아한 것은 항상 당연합니다! 나는 모델을 업데이트하고 객체를 재사용하는 팬이다. 그러나 모델을 업데이트해야 할 필요가 있다면 (함수가 아니라) 데이터베이스를 업데이트해야한다. 그러면 새로운 것을 할 수있는 한 그 일을 할 수있다. 열은 save() 이벤트마다 유효성을 검사합니다 (다시 Poll 또는 Choice 개체 일 것입니다!).

링크는 'Ideas for more tests'에서 구체적으로 https://docs.djangoproject.com/en/1.6/intro/tutorial05/입니다.

답변

3

이것은 과도 할 수도 있지만 선택 항목 수를 주석하기 위해 집계를 사용하고 필터링을 수행하는 사용자 지정 관리자 모델에서 사용할 수 있도록 만드는 것이 좋습니다. 같은 뭔가 :

from django.db.models import Count 
class PollManager(models.Manager): 
    def with_counts(self): 
     return self.get_queryset().annotate(choice_count=Count('choice') 

    def choices_only(self): 
     return self.with_counts().exclude(choice_count=0) 


class Poll(models.Model): 
    ... 
    objects = PollManager() 

지금 당신은 단지 선택이 선거를 반환하는 Poll.objects.choices_only()를 사용할 수 있습니다.

이 모든 말했다
+1

나는 믿는다. 더 좋은 이름은'has_choices' 일 것입니다. –

1

, 나는 그들에 매핑 어떤 선택이없는 여론 조사를 보여주는 배제 내 여론 조사/view.py 에 필터를 추가하는 방법을 생각할 수 없다. 나는 Poll.objects.exclude이 (... 일하는 것이 생각 하지만 그것은 가지고 있지 않는 선택에 대해 쿼리를 결합하여 복잡해진다 그 결과에 매핑 외국 키의.

다니엘의 대답은 중대하다, 당신은 (당신의 모델을 수정하지 않고)보기에 직접 사용할 수 있습니다 여기에

have_choices = Poll.objects.annotate(choice_count=Count('choice')) \ 
          .filter(choice_count__gt=0) 

필터, 당신은 나에게 적어도이 그 조사를 보여줄 것을 좀 더 명시 적으로 진술하는됩니다 하나의 선택.

관련 문제