2017-01-24 3 views
1

meine Modelle Angenommen:django Filter queryset auf Zählung eines anderen queryset basierend

model book 
    charfield name 

model review 
    charfield bookname 

Gibt es eine Möglichkeit zu filtern/ausschließen die Bücher Bewertung Null zählen? Ich habe das im Stackoverflow durchgesehen, konnte aber keine Antwort finden. Dies ist keine Hausaufgabenfrage. Ich habe ein Anfrage-Set ca. Größe um 200.000, aus denen ich zu dem Schluss kam, dass es nicht schlau ist, zu filtern, indem Sie das Abfrage-Set in eine Python-Liste konvertieren, filtern und dann zurück konvertieren. Kann mir jemand dabei helfen? Dank

+1

Gibt es einen Grund, warum Ihr Überprüfungsmodell ein Charfield mit einem Buchnamen anstelle eines Fremdschlüssels direkt zum Korrekt hat t Objekt buchen? Der Filter wäre einfacher zu machen, wenn die Modelle tatsächlich verknüpft wären. Außerdem ist aus Ihrer Frage nicht klar, ob Sie die Bücher ohne Bewertungen aus Ihrem Suchanfragensatz beibehalten oder ausschließen möchten. – ChidG

+0

@ChidG danke für die Antwort. Angenommen, ich habe eine große Menge an Büchern und Rezensionen, dachte ich, dass das Verbinden einer Rezension mit einem Buch jedes Mal, wenn ich es hinzufüge, wegen der Nachschlagezeit zu lange dauern würde. Sollte die Verknüpfung dafür der Weg sein? – verticese

+0

Die Verknüpfung mit einem Fremdschlüssel ist definitiv der beste Standard, um dieses Problem zu lösen. Die Zeit, um einen Datenbank-Join zwischen den beiden Tabellen zu machen, wird weitaus weniger Probleme bereiten als die anderen Probleme, die dadurch verursacht werden, dass sie nicht verbunden werden. Zum Beispiel müsste Ihre Datenbank viel größer sein (auf Speicherplatz), weil die Buchnamen alle an mehreren Stellen gespeichert werden müssen. Und was passiert, wenn Sie mehr als ein Buch mit demselben Namen haben? Oder wenn jemand in einer Rezension einen Buchnamen falsch eingibt? Ich würde vorschlagen, dass Sie etwas über das Design relationaler Datenbanken nachlesen. – ChidG

Antwort

1

Zuerst können Sie die Liste Buch abfragen, die Bewertung hat, und dann Kompliment erhalten, indem django mit exclude

bookname_has_review = Review.objects.all().distinct().values_list('bookname', flat=True) 
book_not_have_review = Book.objects.all().exclude(name__in=bookname_has_review) 
2

Weil ich stark Ihre Modelle zu ändern empfehlen einen Fremdschlüssel von der Überprüfung enthalten zu buchen (für die vielen anderen Vorteile, dass Sie tun, anstatt zu versuchen, das genaue Problem, über das Sie gefragt haben, zu lösen, werde ich Ihnen einen Tipp geben, wie Sie Ihre Modelle mit einem Fremdschlüssel schreiben und dann, wie Sie das Problem lösen habe ich im Zusammenhang mit einer Fremdschlüsselbeziehung gefragt.

Hier sind die neuen Modelle, die ich denke, Sie sollten schreiben:

from django.db import models 

class Book(models.Model): 
    name = models.Charfield() 

class Review(models.Model): 
    book = models.ForeignKey(Book, related_name='reviews') 

Dann für alle Bücher zu filtern Berichte, die Sie tun können:

books_with_reviews = Book.objects.filter(reviews__isnull=False).distinct() 

Oder für Bücher ohne Bewertungen:

Book.objects.filter(reviews__isnull=True).distinct() 
+0

Danke, ich werde mein Schema ändern. Das ist eine gute Idee. – verticese

Verwandte Themen