2011-09-17 12 views
9

In Django, è possibile effettuare query di database come il seguente:di Django doppia sottolineatura

Model.objects.filter(name__icontains = 'bob') 

La domanda è: come è questo lavoro 'sotto la copertura'? Il doppio sottolinea una cosa di Django o una cosa di Python? Si tratta di una singola variabile denominata name__icontains o è una sorta di sintassi dell'accesso agli attributi? Nel primo caso, in che modo il metodo filter analizza il nome della variabile per determinare che si sta cercando la tabella Model per un nome che contiene da qualche parte nella stringa bob?

risposta

12

È una cosa Django, implementata con alcune cose di Python.

In Python, è possibile ottenere un dizionario della parola chiave argomenti passati ad una funzione o di un metodo:

>>> def func(*args, **kwargs): 
...  print(kwargs) 
>>> func(a=1, b=2) 
{'a': 1, 'b': 2} 

Da lì, si può semplicemente scandire le chiavi del dizionario e dividerli in __, e poi interpretare ma vuole comunque. In questo caso, prende l'ultima parte e interpreta icontains come non contiene maiuscole e minuscole.