2017-02-05 8 views
0

Ich bin am Bau der Django-Umfrage-Beispiel. Ich möchte alle Umfragen ausschließen, die keine Wahlmöglichkeiten haben. Dafür muss ich Objekte die damit verbundenen Möglichkeiten zugreifen:Filter verwandte Modell django

return Question.objects.filter(
pub_date__lte=timezone.now() 
).exclude(
    choice_set__count=0 
).order_by('-pub_date')[:5] 

Aber diese Abfrage-Ergebnisse in einem Feldfehler:

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

Wie kann ich im Zusammenhang Modelle aus der Abfrage abzufragen?

Antwort

1

Im Choice Modell setzen die related_name zum Question Fremdschlüssel. Beispiel:

class Choice(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='choices') 
    # other code.. 

Und dann sollten Sie Ihre Abfrage so ähnlich sein:

return (Question.objects 
     .filter(pub_date__lte=timezone.now(), 
       choices__isnull=False) 
     .order_by('-pub_date')[:5]) 

Hinweis: Es gibt keine `__count‘ Lookup. Wenn Sie sich auf Zählungen verlassen wollen, überprüfen Sie die docs on this.

Dok: https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ForeignKey.related_name

0

Die _set gilt nur, wenn Sie, dass verwenden außerhalb des queryset das zugehörige Modell abzurufen, anstatt, wie der Fehler schon sagt, können Sie nur choice

.exclude(choice__isnull=True) 
2

gegen einem verwandten Modell zu filtern, können Sie Verwenden Sie einfach den Namen des Kleinbuchstabenmodells - Sie können sehen, dass choice eines der verfügbaren Felder ist.

Dies funktioniert jedoch immer noch nicht; Es gibt kein Attribut __count, das gefiltert werden soll. Sie können einen von Annotationen verwenden, fügen aber es gibt einen einfacheren Weg: vergleichen gegen None:

.exclude(choice=None) 
Verwandte Themen