2016-05-02 11 views
0

Ich beginne Django mit dem offiziellen Tutorial
https://docs.djangoproject.com/en/1.9/intro/tutorial05/#ideas-for-more-testsargs mit filter() in Django

Um zu erfahren, die zu folgenden Aktionen ausführen:

es albern ist, dass Fragen auf der Website veröffentlicht werden können, dass haben keine Auswahlmöglichkeiten. Also, unsere Ansichten könnten dies überprüfen und solche Fragen ausschließen. Unsere Tests würden eine Frage ohne Optionen erstellen und dann testen, dass es nicht veröffentlicht wird, sowie eine ähnliche Frage mit Auswahlmöglichkeiten erstellen und testen, dass es veröffentlicht wird.

Ich habe , choice_set__count__gt=0-filter() - will nur auf jede Frage die Anzahl der Möglichkeiten, um sicherzustellen, entspricht, ist größer als 0 ist, dann werfen die Ausnahme

FieldError at /polls/ 
Cannot resolve keyword 'choice_set' into field. Choices are: choice, id, pub_date, question_text 

vollständige Code

class IndexView(generic.ListView): 
    template_name = 'polls/index.html' 
    context_object_name = 'latest_question_list' 

    def get_queryset(self): 
     """Return the last five published questions.""" 
     return Question.objects.filter(
      pub_date__lte=timezone.now(), choice_set__count__gt=0 
     ).order_by('-pub_date')[:5] 

(1) Ich frage mich, warum die Ausnahme hier passiert ist? Irgendeine Möglichkeit, es zu korrigieren?

(2) Laut der Ausnahme scheint jedes Frageobjekt eine Auswahlmöglichkeit zu haben, woher kommt dieses Feld?

(3) Gibt es eine bessere Lösung, um das Grundproblem zu lösen? Ich denke, dass die Änderung der Frageklasse ein guter Weg ist, das eigentliche Problem zu lösen.

Modelle von here

+1

Können Sie den Beitrag mit Modellen aktualisieren? – Abhinav

+0

@AbhinavI Modelle von https://bpaste.net/show/56d83049dd33 – iMath

Antwort

1

können Sie annotate für diese Art der Sache nutzen - das eine zusätzliche Aggregat Spalte und Filter auf das wird hinzufügen:

def get_queryset(self): 
    """Return the last five published questions.""" 
    return Question.objects \ 
     .annotate(choices=Count('choice')) \ 
     .filter(pub_date__lte=timezone.now(), choices__gt=0) \ 
     .order_by('-pub_date')[:5] 

nun die daraus resultierenden Frage Objekte auch eine choices haben Attribut auf die Anzahl der Auswahlmöglichkeiten gesetzt, die Sie später verwenden können.