2011-03-30 25 views
5

Yani django içinde bazen çok fazla alt çizgiNeden django, filtre sorguları yaparken çift alt çizgi kullanmalıdır?

Entry.objects.filter olduğundan çirkin görünüyor

Entry.objects.filter(blog__id=3) 

(blog_something_ _too_ birçok _ID = 3 çizgi) yazmak neden django

[entry.objects if blog.id=3 ] 
gibi sözdizimi kullanamazsınız 0

?

Bu konuda uzman değilim, ancak neden çift alt çizgi çizmeli? Bunu yazmak için python dilbilgisinde daha zarif bir stil olabilir mi? "Ayrıca

[entry.objects if blog.id=3 ] 

:

+0

Yanlış bir şey bulamadım, ancak diğer gerçekçi ve temiz seçeneklerin hepsini merak ediyorum. Argümanları bir python işlevine aktarmak, dilin oldukça temel bir parçasıdır ve yazarlar, anahtar kelime bağımsız değişken isimlerini kullanır. fields_and_lookups = kwarg.split ('__') ' –

cevap

9

Django imkansız aşağıdaki önerilen sözdizimi (Python temel cümle çok tekrar tanımını izin vermez) yapım sözdizimi geldiğinde bazı temel kısıtlamaları belirleyen Python, üzerinde çalışır blog "ve" id "nesneleri değil, veritabanındaki isimlere atıfta bulunurlar, bu nedenle blog.id gibi adresleme de sorunludur. Elbette, bir dizge olarak girilmediği sürece, aslında, anahtar kelime argümanlarının Python'da bir sözlük nesnesi olarak geçtiği gibi, ne yapılmakta olduğudur. Elbette başka şekillerde yapılabilir, burada ayırıcı olarak nokta nasıl kullanılacağına ilişkin bir örnek: Django filtre işlevi bu birleşmeyle

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

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

, biz dotstyle fonksiyonu ve garip ile uzak yapabilirdi ** Ama yine de sözlük parantezini bırakıyoruz, muhtemelen bunun yerine çift alt çizgi ile gittiler.