2011-03-30 8 views
5

Así que en Django escribimos¿Por qué django tiene que usar doble guion bajo al hacer consultas de filtro?

Entry.objects.filter(blog__id=3) 

que se ve feo porque a veces hay demasiados guiones

Entry.objects.filter (blog_something_ subrayan _too_ muchos _id = 3)

¿Por qué django no puede utilizar la sintaxis como

[entry.objects if blog.id=3 ] 

?

No soy experto en esto, pero ¿por qué debe doblar el subrayado? ¿Podría haber un estilo más elegante en la gramática de Python para escribir esto?

+0

No encuentro nada de malo en ello, pero tengo curiosidad por cualquier otra opción realista y limpia. Pasar argumentos a una función de python es una parte muy básica del lenguaje, y los autores aprovecharon los nombres de los argumentos de palabras clave. 'fields_and_lookups = kwarg.split ('__')' –

Respuesta

9

Django ejecuta en Python, que establece algunas limitaciones básicas cuando se trata de la sintaxis, por lo que la siguiente sintaxis sugerido imposible (Python no permite mucho re-definición de sintaxis básica):

[entry.objects if blog.id=3 ] 

Además, " blog "e" id "no son objetos, se refieren a nombres en la base de datos, por lo que abordarlos como blog.id también es problemático. A menos que, por supuesto, se ingrese como una cadena, que en realidad es lo que se está haciendo, ya que los argumentos de palabra clave se pasan como objetos de diccionario en Python. Podría, por supuesto, puede hacer de otras maneras, aquí es un ejemplo de cómo utilizar puntos como separadores:

def dotstyle(dict): 
    retdict = {} 
    for key, value in dict.items(): 
     retdict[key.replace(".", "__")] = value 
    return retdict 

Entry.objects.filter(**dotstyle({"blog.id": 3}) 

Al incorporar esto a la función de filtro en Django, podríamos eliminar la función dotstyle y la incómoda **, pero todavía nos quedan las llaves del diccionario, que es probablemente la razón por la que usaron los doble guiones bajos en su lugar.

Cuestiones relacionadas