2011-10-19 9 views
0

未加工SQLクエリを使用しているときにPython djangoでフォームを処理する際にいくつか問題があります。私は参考としてhttps://docs.djangoproject.com/en/dev/topics/db/sql/を使用しました。 Raw SQLクエリから返されるRawQuerySetを反復処理しようとすると、エラーが発生します。どんな助けもありがとう。ここは私の見解の一部です。Python Django Raw 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インジェクション攻撃に向けて広く開いたままにしました。誰かがpr_nameフィールドに"foo'; DELETE FROM pr;"を提出すればどうなりますか?そうですね、データベースは忠実に2つのコマンドを実行してprテーブルを削除します。

通常、Djangoはすべての入力を適切に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 

あなたの文字列を置換する必要がある2 %sを持っていますが、あなただけ%オペレータの後に一つの変数を持っています。

%演算子を誤って使用したために、スタックトレースに何か問題があるかどうかはわかりません。 forループはそれをトリガーしません。

関連する問題