2011-09-17 5 views
9

En Django, puede realizar consultas de bases de datos como el siguiente:de Django doble guión

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

La pregunta es: ¿cómo es esto de trabajo 'bajo la cobertura'? ¿El guión bajo doble es una cosa de Django o algo de Python? ¿Es solo una variable única llamada name__icontains, o es algún tipo de sintaxis de acceso a atributos? En el primer caso, ¿cómo el método filter analiza el nombre de la variable para determinar que está buscando en la tabla Model un nombre que contiene en alguna parte de la cadena bob?

Respuesta

12

Es una cosa de Django, implementada con algunas cosas de Python.

En Python, puede obtener un diccionario de los argumentos clave pasados ​​a una función o método:

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

A partir de ahí, simplemente se puede iterar sobre las claves del diccionario y partirlos en __, y luego interpretar lo que quiera. En este caso, toma la última parte e interpreta icontains como contiene mayúsculas y minúsculas.