Ist es wie ein normales Python-Set?

Angenommen, ich habe das folgende Abfrageset

entry_set = Entry.objects.all()

Wie überprüfe ich, ob das Eintragsobjekt e in entry_set vorhanden ist?

26
Brian 14 Aug. 2015 im 07:18

4 Antworten

Beste Antwort

Sie können den folgenden Code verwenden:

if e in Entry.objects.all():
        #do something

Oder der beste Ansatz:

if Entry.objects.filter(id=e.id).exists():
        #do something
23
Community 19 Nov. 2018 im 05:51

Sie können das Abfrageset einfach anhand eines eindeutigen Schlüssels filtern, der im Eingabemodell vorhanden ist. Angenommen, dieser Schlüssel ist id, Ihr Code würde werden:

is_present = Entry.objects.filter(id=e.id)
if is_present:
    print "Present"
else:
    print "Not Present"
0
Animesh Sharma 14 Aug. 2015 im 04:22

Sie können den Operator in verwenden:

entry_set = Entry.objects.all()
if an_entry in entry_set:
    # The element present.
1
Will 14 Aug. 2015 im 05:24

Der beste Ansatz laut Django-Dokumentation: https://docs.djangoproject.com /de/2.1/ref/models/querysets/

if Entry.objects.filter(id=item.id).exists():
    # Do something

Sie können aber auch:

if item in Entry.objects.all():
    # Do something

Obwohl dieser Ansatz so schlechter als möglich ist. Weil es das gesamte Queryset durchlaufen wird, indem Elemente einzeln aus der Datenbank abgerufen werden, verglichen mit dem anderen Ansatz, der fast alles auf Datenbankebene erledigt.

Wenn Sie eine Liste von IDs oder ein Queryset haben, verwenden andere Ansätze __in

Beispiel mit einem Queryset:

query_ids = other_queryset.values_list('field_id', flat=True)
if Entry.objects.filter(id__in=query_ids).exists():
    # Do something

Oder wenn Sie eine Liste von IDs haben:

if Entry.objects.filter(id__in=[1, 2, 3, 4, 5]).exists():
    # Do something

Denken Sie daran, dass Sie jedes Mal, wenn Sie len(queryset), item in queryset oder list(queryset) ausführen, die Leistung von Django stark beeinträchtigen. Ich sehe bereits Fälle, in denen wir durch das Vermeiden dieser Praktiken Dutzende von Sekunden in einer Anwendung verbessert haben.

7
Renato César 11 Nov. 2018 im 09:49