esempio abbastanza semplice - ho un po 'di codice di Django che inizia con un set di query ...A che punto sono le eccezioni sollevate quando si utilizza ORM di Django
queryset = MyModel.objects.all()
In seguito si esegue varie filtraggio, a seconda alcuni configurabile opzioni ...
if something:
queryset = self.queryset.filter(foo=some_foo)
if another_thing:
queryset = self.queryset.filter(bar=some_bar)
E infine esegue la ricerca ...
try:
obj = queryset.get()
except ObjectDoesNotExist:
raise ValidationError('Does not exist')
Ora, essere A causa del modo flessibile in cui deve avvenire il filtraggio, è possibile che le variabili some_foo
o some_bar
non siano del tipo corretto (ad es. potremmo finire con una stringa vuota che tenta di filtrare su un campo intero.) quindi è possibile che questo codice finisca per generare un TypeError
o un ValueError
.
va bene, e posso gestire il caso in modo appropriato, ma ciò che non mi è chiaro dal contratto ORM, è a che punto devo aspettarmi tali eccezioni da sollevare.
- verrà in mente sulla dichiarazione
.filter()
? ... - ... o sulla dichiarazione
.get()
? ... - ... o è in underspecified, e mi occupo come in grado di si verificano su entrambi? (Ad esempio, forse in base alla realizzazione del terminale database?)
forse mi manca qualcosa, ma ho bisogno di chiedere: perché stai chiamando salire sul queryset? filter() e get() hanno scopi diversi e entrambi eseguono una query. e filter() è il primo a eseguire una query -> l'errore Type/Value verrà generato durante il filtraggio. non si raggiunge il get() –
Nota: Va bene, posso vedere in questo caso particolare che sembra essere sollevato dall'istruzione '.get()' (che è quello che mi aspettavo), ma non è chiaro se posso tranquillamente fare affidamento su questo comportamento per essere coerenti. –
@SamueleMattiuzzo Le istruzioni filtro possono essere concatenate. Il finale '.get()' è il bit che esegue la ricerca di un singolo oggetto, data la query. –