2011-03-30 6 views
5

Quindi, in Django scriviamoPerché django deve utilizzare il doppio trattino basso quando si effettuano le query sui filtri?

Entry.objects.filter(blog__id=3) 

Il che sembra brutto perché a volte ci sono troppe sottolineature

Entry.objects.filter (blog_something_ sottolineano _too_ molti _ID = 3)

perché Django non può usare la sintassi come

[entry.objects if blog.id=3 ] 

?

Non sono esperto in questo, ma perché doppio punto di sottolineatura? Potrebbe esserci uno stile più elegante nella grammatica di Python per scrivere questo?

+0

Non trovo nulla di sbagliato in questo, ma sono curioso di altre opzioni realistiche e pulite. Passare argomenti a una funzione python è una parte enorme della lingua e gli autori hanno sfruttato i nomi degli argomenti delle parole chiave. 'fields_and_lookups = kwarg.split ('__')' –

risposta

9

Django gira su Python, che definisce alcuni vincoli fondamentali quando si tratta di sintassi, rendendo la seguente sintassi suggerita impossibile (Python non permette molto di ri-definizione di sintassi di base):

[entry.objects if blog.id=3 ] 

Inoltre, " blog "e" id "non sono oggetti, si riferiscono ai nomi nel database, quindi anche l'indirizzamento a questi come blog.id è problematico. A meno che non venga immesso come una stringa, che in realtà è ciò che viene fatto visto che gli argomenti delle parole chiave vengono passati come oggetti dizionario in Python. Si potrebbe naturalmente essere fatto in altri modi, ecco un esempio di come utilizzare i punti come separatori:

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

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

Incorporando questo per la funzione di filtro in Django, potremmo fare via con la funzione dotstyle e il goffo **, ma ci rimangono ancora le parentesi graffe del dizionario, che è probabilmente il motivo per cui sono state utilizzate con i doppi underscore.

Problemi correlati