Es gibt wahrscheinlich eine bessere Möglichkeit, mit nicht vorhandenen Abfragesätzen umzugehen ...! Das Problem, das ich mit diesem Code habe, ist, dass es eine Ausnahme auslöst, wenn der Normalfall wahr ist! Das heißt: Wenn ein gleichnamiger Arbeitsbereichsname in der Datenbank nicht vorhanden ist.

Aber anstatt eine Ausnahme zu haben, möchte ich eine Abfrage durchführen, die nicht DoesNotExist zurückgibt, sondern true oder false

Mein uneleganter Code:

 try:
            is_workspace_name = Workspace.objects.get(workspace_name=workspace_name,user=self.user.id )
 except:
        return workspace_name
 if is_workspace_name:
            raise forms.ValidationError(u'%s already exists as a workspace name! Please choose a different one!' %workspace_name  ) 

Danke vielmals!

0
Jurudocs 7 Okt. 2012 im 01:02

3 Antworten

Beste Antwort

Sie können die exist () Methode verwenden. Zitieren von Dokumenten:

Gibt True zurück, wenn das QuerySet Ergebnisse enthält, und False, wenn nicht. Dadurch wird versucht, die Abfrage so einfach und schnell wie möglich durchzuführen, es wird jedoch fast dieselbe Abfrage wie bei einer normalen QuerySet-Abfrage ausgeführt.

Anmerkungen: der einfachste und schnellste Weg. Die Verwendung von exists (als count) ist billiger, da die Datenbank mit exists gestoppt wird beim ersten Auftreten zählen.

if Workspace.objects.filter(workspace_name=workspace_name, 
                            user=self.user.id).exists()
    raise forms.ValidationError(u'%s already exists ...!' % workspace_name)
else:
    return workspace_name
3
Ghopper21 7 Okt. 2012 im 09:37
obj, created = Workspace.objects.get_or_create(workspace_name=workspace_name, user=self.user.id)

if created:
    # everything ok
    # do something
    pass
else:
    # not ok
    # respond he should choose anything else
    pass

Lesen Sie mehr in den Dokumenten

0
Thomas Schwärzl 6 Okt. 2012 im 21:04

Überprüfen, ob ein Datensatz vorhanden ist.

Wenn Sie prüfen möchten, ob in Ihrer Datenbank ein Datensatz vorhanden ist, verwenden Sie möglicherweise Workspace.objects.filter(workspace_name = workspace_name,user = self.user.id).count().

Dies gibt die Anzahl der Datensätze zurück, die Ihren Bedingungen entsprechen. Diese Zahl ist 0, falls es keine gibt, was mit einer if -Klausel leicht verwendet werden kann. Ich glaube, dies ist für mich der Standard und einfachste Weg, um das zu tun, was Sie hier brauchen.

## EDIT ## Eigentlich ist das falsch. Vielleicht möchten Sie die Antwort von danihp auf eine bessere Lösung mit Queryset.exists überprüfen!

Ein Wort der Warnung: der Fall der Überprüfung der Existenz vor dem Einfügen

Seien Sie jedoch vorsichtig, wenn Sie ein solches Konstrukt verwenden, insbesondere wenn Sie vor dem Einfügen eines Datensatzes prüfen möchten, ob Sie ein Duplikat haben. In einem solchen Fall besteht die beste Lösung darin, zu versuchen, den Datensatz zu erstellen und festzustellen, ob eine Ausnahme ausgelöst wird.

In der Tat könnten Sie sich in der folgenden Situation befinden:

  1. Anfrage 1 erreicht den Server
  2. Anfrage 2 erreicht den Server
  3. Die Prüfung erfolgt für Anforderung 1, es ist kein Objekt vorhanden.
  4. Die Überprüfung erfolgt für Anforderung 2, es ist kein Objekt vorhanden.
  5. Fahren Sie mit der Erstellung in Anforderung 1 fort.
  6. Fahren Sie mit der Erstellung in Anforderung 2 fort.

Und ... Sie haben ein Duplikat - dies wird als Rennbedingung bezeichnet und ist eine häufiges Problem beim Umgang mit parallelem Code.

Lange Rede, kurzer Sinn , Sie sollten beim Einfügen die Einschränkungen try, expect und unique verwenden.

Die Verwendung von get_or_create, wie von init3 vorgeschlagen, hilft ebenfalls. get_or_create ist sich dessen bewusst, und Sie sind in Sicherheit, solange unerwünschte Duplikate ein IntegrityError auslösen.

1
Thomas Orozco 6 Okt. 2012 im 21:22