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.
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 ('__')' –