2017-05-17 6 views
2

Ich versuche, ein Django QuerySet zu filtern. Ich weiß, dass die Filterbedingungen manchmal ungültig sind. In diesem Fall möchte ich den Fehler abfangen. Hier ist ein dummes erfundenes Beispiel:Django QuerySet-Filter ValueError nicht gefangen?

models.py:

from uuid import uuid4 
from django.db import models 

class MyModel(models.Model): 
    class Meta: 
     app_label = "my_app" 
     abstract = False 
    guid = models.UUIDField(default=uuid4, editable=False) 


try: 
    my_filtered_models = MyModel.objects.filter(guid='invalid_guid') 
except ValueError: 
    print "you messed up" 

Nun soll dies ein Valueerror erhöhen, weil ‚invalid_guid‘ keine gültige UUID ist - es sollte so etwas wie ‚sein‘ 9a3c21a5- 09f7-4676-9ecf-c1672fa69bc0 'offensichtlich). Aber ich erreiche nie den except Block.

Irgendwelche Vorschläge?

+0

hängt davon ab, wo Sie den Code geschrieben haben? und wie zugreifen Sie es – Exprator

+0

versuchen 'DoesNotExist' – Tushortz

+0

in "django.db.models.fields.UUIDField # get_db_prep_value" verwendet es 'invalid_guid' zu versuchen, eine UUID zu erstellen:' value = uuid.UUID (value.replace (‘ - ',' ')). Dies ist der Punkt, an dem ein ValueError ausgelöst wird, aber immer noch nicht von meinem Code abgefangen wird. – trubliphone

Antwort

1

Von django documentation, Zitat

Klasse UUIDField (** Optionen) [Quelle] ¶

Ein Feld universell eindeutige Kennungen für die Speicherung. Verwendet Pythons UUID-Klasse. Bei Verwendung in PostgreSQL wird dies in einem UUID-Datentyp gespeichert, andernfalls in einem Zeichen (32).

Auch aus Python docs, Zitat

Klasse uuid.UUID (hex = None, Bytes = None, bytes_le = None, Felder = None, int = None, Version = None)

erstellen

ein UUID entweder von einer Zeichenfolge von 32 hexadezimalen Ziffern, eine Zeichenfolge von 16 Byte als Byte Argument, eine Zeichenfolge von 16 Bytes in little-endian-Ordnung als bytes_le Argument, ein Tupel von sechs Ganzzahlen (32-Bit time_low, 16-bit time_mid, 16-bit time_hi_version, 8-bit clock_seq_hi_variant, 8-bit clock_seq_low, 48-bit-Knoten) als Feldargument oder eine einzelne 128-Bit-Ganzzahl als das int-Argument

um auf den Punkt,

UPDATE

Schließlich spezifisch zu sein, ich es habe. Eigentlich wirft Django Fehler auf.

Ich werde nur mit einem einfachen Beispiel veranschaulicht,

einfach Ihren Code versuchen,

my_filtered_models = MyModel.objects.filter(guid='invalid_guid') 

Dieser Code wirft Fehler nicht auf, weil die try-Anweisung der Zuordnung besteht unabhängig von dem Ergebnis der die Abfrage, die Sie gerade mit der Variablen "my_filtered_models" durchgeführt haben. Wenn Sie jedoch versucht haben, zu drucken oder auf my_filtered_variable zuzugreifen, wird der ValueError ausgelöst.

Infact,

MyModel.objects.filter(guid='invalid_guid') 

Diese Aussage wirft Valueerror. Ich ziehe meine vorherige Antwort zurück, indem ich sie selbst lösche, auch meine Entschuldigung für diese fehlerhafte Antwort.

Also, Ihr Code,

try: 
    my_filtered_models = MyModel.objects.filter(guid='invalid_guid') 
except ValueError: 
    print "you messed up" 

tritt nicht die Ausnahme, denn jedes Mal wenn es läuft, wird der Valueerror auf my_filtered_models zugeordnet. Nur wenn auf die Variable zugegriffen wird, wird der Fehler ausgelöst.

Ich hoffe, Sie haben bekommen, was Sie gesucht haben.

+0

Ich benutze Python 2.7.12 und Django 1.8.2. – trubliphone

+0

Der eigentliche Fehler kommt nicht aus dem Feld pk (das ich nur als einfaches Beispiel verwendet habe), sondern aus einem Uuid-Feld. Ich werde die Frage bearbeiten, um dies zu reflektieren. – trubliphone

+0

in Ordnung, überprüfe ich werde das auch – zaidfazil

0

Überprüfen Sie Ihre invalid_pk es vielleicht im Bereich der valid_pk. Können Sie bitte posten weitere Informationen über valid_pk

Verwandte Themen