2011-10-19 4 views
0

원시 SQL 쿼리를 사용할 때 python django에서 내 양식을 처리하는 데 문제가 있습니다. 나는 https://docs.djangoproject.com/en/dev/topics/db/sql/을 참조로 사용했다. 원시 SQL 쿼리에서 반환되는 RawQuerySet을 반복 할 때 오류가 발생합니다. 어떤 도움을 주시면 감사하겠습니다. 여기 내 견해의 일부입니다.Python Django 원시 SQL 반복이 TypeError로 연결됩니다.

class SearchForm(forms.Form): 
    pr_name = forms.CharField(label="Pr Name", max_length=64, required=False) 
    org = forms.ModelChoiceField(queryset=Org.objects.all(), required=False) 
    group_name = forms.CharField(label="Unique Submission Name", max_length=64, required=False) 
    group_ref = forms.CharField(label="Ref", max_length=12, required=False) 
    group_url = forms.URLField(label="URL", required=False) 

def search(request): 
    if request.method == 'POST': 
     form = SearchForm(request.POST) 
     if form.is_valid(): 
      p_ids = [] 
      g_ids = [] 
      f_ids = [] 

     logging.debug('hello1') 
     # Filter first 
     firstQuery = 'SELECT * FROM pr where ' 
     pr_name = form.cleaned_data['pr_name'] 
     if pr_name: 
      logging.debug('hello2') 
      firstQuery += '(name like \'%' + pr_name + '%\')' 
     else: 
      pass 

     logging.debug('hello3') 
     org = form.cleaned_data['org'] 
     if org: 
      org = Org.objects.get(name = org) 
      org_id = org.id 
      firstQuery += '(org_id = ' + str(org_id) + ')' 
     else: 
      pass 

     firstQuery = firstQuery.replace(')(', ') AND (') 
     #logging.debug('First query: %s' % firstQuery) 
     p_search_results = P.objects.raw(firstQuery) 
     logging.debug('First query: %s' % p_search_results) 
     for x in p_search_results: 
      p_ids.append(x.id) 
     logging.debug('p_ids: %s' % p_ids) 


     # Filter Group 
     secondQuery = 'SELECT * FROM group where ' 
       group_name = form.cleaned_data['group_name'] 
     if group_name: 
      secondQuery += '(name like \'%' + group_name + '%\')' 
     else: 
      pass 

     group_ref = form.cleaned_data['group_ref'] 
     if group_ref: 
      secondQuery += '(ref like \'%' + group_ref + '%\')' 
     else: 
      pass 

     group_url = form.cleaned_data['group_url'] 
     if group_url: 
      secondQuery += '(method_url like \'%' + group_url + '%\')' 
     else: 
      pass 

     secondQuery = secondQuery.replace(')(', ') AND (') 
     logging.debug('Second query: %s' % secondQuery) 
     group_search_results = PredictionGroup.objects.raw(secondQuery) 
     logging.debug('Second query: %s' % group_search_results) 
     for x in group_search_results: 
      g_ids.append(x.id) 
     logging.debug('g_ids: %s' % g_ids) 

... 
... 
... 

는 그리고 오류는 다음과 같습니다

TypeError at /search/ 
not enough arguments for format string at: 
for x in p_search_results: 

답변

2

, 적, 적, 적, 적 같은 SQL 매개 변수를 구축하지 마십시오. 사실, 그렇게 중요합니다. 저는 다시 한번 말하죠 : 절대로, 언제나, 언제나, 언제나, 언제 까지나 그런 SQL 매개 변수를 구축하십시오. SQL 인젝션 공격에 스스로를 열어 두었습니다. 누군가 "foo'; DELETE FROM pr;"pr_name 필드에 제출하면 어떻게됩니까? 맞습니다. 데이터베이스는 충실하게 두 개의 명령을 실행하고 pr 테이블을 삭제합니다.

장고는 정상적으로 모든 입력을 SQL 명령으로 올바르게 이스케이프 처리하여 사용자를 보호합니다. 어떤 이유로 ORM을 우회하도록 선택했습니다 : 이제는 복잡한 쿼리를 작성하기 위해 때때로해야 할 일이 있지만 위에서 보여준 쿼리에는 아무 것도 복잡하지 않습니다.

group_query = Group.objects.all() 
group_name = form.cleaned_data['group_name'] 
if group_name: 
    group_query = group_query.filter(name__icontains=group_name) 
org = form.cleaned_data['org'] 
if org: 
    group_query = group_query.filter(org__name=org) 

등 :

는이 같은 일을해야합니다.

0

오류 not enough arguments for format string이 같은 라인에서 온다 :

"Something %s and %s" % x 

귀하의 문자열을 교체해야 할 두 %s을 가지고 있지만, 당신은 단지 % 운영자 후 하나 개의 변수가있다.

% 연산자를 잘못 사용하면 스택 추적에 문제가 있는지 궁금 할 수 없습니다. for 루프가 트리거하지 않습니다.

관련 문제