2016-10-08 6 views
0

私はPython REST APIに新しく、いくつかの特定の問題に直面しています。私はpathlabid(プライマリキー)として入力を入力すると、そのキーに割り当てられた対応するデータを出力したいと思います。次のコードを実行すると、IDが他の行に属する場合でも、データベースのテーブルの最初の行に対応するデータしか取得されません。 これは、第一のエントリにそのループ断線JSONを使ってPythonでRest Apiを作成していますか?

import json 
some_list = [] 
for i in data: 
    some_list.append({"key": "value"}) 
return HttpResponse(json.dumps({"some_list": some_list}), content_type="application/json") 

はあなたの問題

+0

Djnago Rest Framework(http://www.django-rest-framework.org/)を使用すると、あなたの人生ははるかに簡単になります –

答えて

0

を解決するために、上記の例みてあなたがありますforループで応答を返されVIEWS.PY

class pathlabAPI(View): 
@csrf_exempt 
def dispatch(self, *args, **kwargs): 
    # dont worry about the CSRF here 
    return super(pathlabAPI, self).dispatch(*args, **kwargs) 

def post(self, request): 
    post_data = json.loads(request.body) 
    Pathlabid = post_data.get('Pathlabid') or '' 
    lablist = [] 
    labdict = {} 

    lab = pathlab() 
    labs = lab.apply_filter(Pathlabid = Pathlabid) 


    if Pathlabid : 


     for p in labs: 
       labdict["Pathlabid"] = p.Pathlabid 
       labdict["name"] = p.Name 
       labdict["email_id"] = p.Emailid 
       labdict["contact_no"] = p.BasicContact 
       labdict["alternate_contact_no"] = p.AlternateContact 
       labdict["bank_account_number"] = p.Accountnumber 
       labdict["ifsccode"] = p.IFSCcode 
       labdict["country"] = p.Country 
       labdict["homepickup"] = p.Homepickup 
       lablist.append(labdict) 
       return HttpResponse(json.dumps(lablist)) 
    else: 

     for p in labs: 
       labdict["bank_account_number"] = p.Accountnumber 
       lablist.append(labdict) 
       return HttpResponse(json.dumps(lablist)) 
+0

私はDjango Rest Frameworkを使用していますが、対応するIDにデータを取得したいと思います。それはGoogleの残りのクライアントで同じをチェックすることはできません。 "chrome://restclient/content/restclient.html"リクエストボディにidを渡します。私はGETメソッドを使用していて、IDを{"Pathlabid":1}として渡していますが、応答本体では、id = 1に対応する単一のエントリだけでなく、すべてのエントリを含むデータの完全なリストを取得しています。 –

+0

シリアライザとビューセットを適切に設定していると仮定して、 'list'メソッドの' kwargs'引数を調べることで、このようにすることができますが、ビューセットに対して 'get'メソッドを利用すると思われますクエリー文字列を渡すのではなく、URLに '/ 1 /'を追加するだけです。しかし、それはこれの範囲を超えて別の質問です。私は概念を得るために[チュートリアルを通して](http://www.django-rest-framework.org/tutorial/quickstart/#serializers)を提案したいと思います。 – Tom

0

です全体的なアプローチとコードの問題の数ですが、あなたが記述している問題を修正することができますが、最初の修正として私はもう1つの答えに同意します:returnステートメントをループから外す必要があります。今すぐループを一歩進んだらすぐにあなたのリストをreturnにしているので、常に1つの要素でリストを取得できます。ここではそのための修正は、(あなたのコードの先頭にfrom django.http import JsonResponseを追加する必要があります)です。

if Pathlabid: 
    for p in labs: 
     labdict["Pathlabid"] = p.Pathlabid 
     labdict["name"] = p.Name 
     labdict["email_id"] = p.Emailid 
     labdict["contact_no"] = p.BasicContact 
     labdict["alternate_contact_no"] = p.AlternateContact 
     labdict["bank_account_number"] = p.Accountnumber 
     labdict["ifsccode"] = p.IFSCcode 
     labdict["country"] = p.Country 
     labdict["homepickup"] = p.Homepickup 
     lablist.append(labdict) 
else: 
    for p in labs: 
     labdict["bank_account_number"] = p.Accountnumber 
     lablist.append(labdict) 

return JsonResponse(json.dumps(lablist)) 

改善だろうDjangoの残りのフレームワークまたは同様のパッケージを使用して、コメントで示唆したように。一般的なルールとして、Djangoやその他のORMでは、このようなクエリセットをループしたり、各要素を調整したりしないようにしたいと考えています。なぜ、クエリーセット自体をシリアル化して、テンプレートや他のコンシューマでこのループにあるロジックを実行しないのですか?

+0

結果は同じです。それはIdを変えた後でさえ私に同じ出力を与えます。 –

関連する問題