2011-03-30 3 views
5

그래서 장고에 우리는 때때로 너무 많은 밑줄필터 쿼리를 작성할 때 django가 두 개의 밑줄을 사용해야하는 이유는 무엇입니까?

Entry.objects.filter 있기 때문에 추한 모습

Entry.objects.filter(blog__id=3) 

(blog_something_ _too_ 많은 _id = 3을 강조) 쓰기 왜 장고는 구문을 사용할 수 없습니까?

[entry.objects if blog.id=3 ] 

?

나는 이것에 대해 전문가가 아니지만 밑줄을 두 번 사용해야하는 이유는 무엇입니까? 파이썬의 문법에 더 우아한 스타일이 있을까요? "또한

[entry.objects if blog.id=3 ] 

:

+0

아무 문제가 없지만 다른 어떤 현실적인 옵션이라도 궁금합니다. 인수를 파이썬 함수에 전달하는 것은 언어의 아주 중요한 부분이며 저자는 키워드 인수 이름을 사용했습니다. 'fields_and_lookups = kwarg.split ('__')' –

답변

9

장고는 불가능 다음과 같은 제안 구문 (파이썬은 기본 구문의 많은 재 정의를 허용하지 않습니다)를 만드는 구문에 관해서 몇 가지 기본적인 제약 조건을 설정하는 파이썬에서 실행 블로그 "와"id "는 객체가 아니므로 데이터베이스의 이름을 참조하므로이 주소를 blog.id으로 지정하는 것도 문제가됩니다. 물론 문자열로 입력되지 않는 한 실제로는 키워드 인수가 파이썬에서 사전 객체로 전달되기 때문에 실제로 수행되는 작업입니다. 그것은 물론 다른 방법으로 수행 할 수있다, 여기에 구분 기호로 점을 사용하는 방법의 예입니다 장고 필터 기능이 통합함으로써

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

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

, 우리는 dotstyle 기능과 어색한 멀리 할 수 **하지만 우리는 여전히 중괄호를 남겨 두었습니다. 아마도 이중 밑줄을 사용했을 것입니다.

관련 문제