2015-02-23 53 views
0

我有數據的JSON文件這樣:創建一個Django的休息API爲我的Python腳本

['dbname' : 'A', 'collection' : 'ACollection', 'fields' : ['name', 'phone_no', 'address']} 
['dbname' : 'B', 'collection' : 'BCollection', 'fields' : ['name', 'phone_no', 'address', 'class']} 

這些是2個例子當中相同格式的多部辭書。

我有一個python代碼,執行以下操作:接受來自用戶的2個輸入 - phone_no和dbname。例如,用戶將phone_no輸入爲xxxxxxxxxx,將dbname輸入爲A.然後,python代碼讀取JSON文件,並將用戶輸入與具有數據庫名稱的詞典元素匹配爲「A」。然後打開數據庫'A',打開相應的集合'ACollection'並打印集合中phone_no值爲xxxxxxxxxx的帖子的相應字段。數據庫是用mongoDB實現的。

我需要爲此代碼構建一個django rest api。最終目標是從瀏覽器訪問代碼。用戶在瀏覽器中提供2個輸入,並執行代碼,返回瀏覽器上顯示的數據。我已經瀏覽了django-rest框架文檔,但我對這個概念很陌生,希望得到一些指導。

如何實現這些功能並創建API?模型,序列化器,視圖和URL文件與我的程序有什麼關係?

models.py

from django.db import models 


class App(object): 
     def __init__(self, phone_no, name, address, categories): 
       self.phone_no = phone_no 
       self.name = name 
       self.address = address 
       self.categories = categories 

這就是我的工作,到目前爲止,上手。但問題是,模型類應該基本上是動態的。例如:如果'A'是數據庫,程序返回3個字段,但如果'B'是數據庫,程序返回4個值,所以我不確定模型類是什麼樣的。

views.py

from django.views.decorators.csrf import csrf_exempt 
from rest_framework.decorators import api_view 
from rest_framework.response import Response 
from pymongo import Connection 
from models import App 
from serializers import AppSerializer 
import json 
import pymongo 
from os import listdir 
import re 
from django import forms 


@csrf_exempt 
@api_view(['GET']) 
def pgs(request): 
    #connect to our local mongodb 
    db = Connection('localhost',27017) 
    #get a connection to our database 
    dbconn = db.general 
    dbCollection = dbconn['data'] 

    if request.method == 'GET': 
     #get our collection 
     items = [] 
     for r in dbCollection.find(): 
      post = App(r["phone_no"],r["name"],r["address"],r["categories"]) 
      items.append(post) 
     serializedList = AppSerializer(items, many=True) 
     return Response(serializedList.data) 
+0

您對數據模型有任何初始代碼嗎?這可能是一個開始的好地方,可以得到更具體的問題。 – dylrei 2015-02-23 23:02:20

+0

到目前爲止,我有一個基本的API設置,僅從數據庫中檢索數據並顯示它。我試圖找出如何在瀏覽器中獲取用戶的phone_no輸入,並用它來查詢數據庫中的帖子。 – user3799658 2015-02-23 23:13:22

+0

太棒了。如果你有一個數據庫,你至少有一個數據模型的開始。你有沒有Django模型類,或者它仍然只是一個數據庫模式?無論哪種方式,讓我們先看看。 – dylrei 2015-02-24 00:00:56

回答

0

比方說,你在兩個不同的數據庫相同的表。我們首先在settings.py中創建兩個數據庫連接。假設這些被稱爲db_a和db_b。我們可以這樣建模:

class PhoneGenome(models.Model): 
    phone_no = models.CharField(length=255) 
    name = models.CharField(length=255) 
    # and so on... 
    class Meta: 
     # if database pre-exists, may want to use managed=False 
     managed = False 

這給了我們一個模型。現在我們根據用戶輸入來選擇從哪個數據庫中提取數據。在視圖中,你可能會碰到這樣的:

db_used = request.GET.get('database') 
db_conns = {'a': 'db_a', 'b': 'db_b'} 
if db_conns.has_key(db_used):  
    records = PhoneGenome.objects.using(db_conns[db_used]).filter(user_criteria_here) 

在你的查詢集的使用()方法是什麼讓你選擇哪個數據庫在其上運行的查詢。

還有很多在這裏潛在的管理,所以這將是看文檔的好時機:https://docs.djangoproject.com/en/1.7/topics/db/multi-db/

如果你有沒有準備好,你真的應該通過Django的教程起碼工作在進一步深入之前。

+0

困難在於,每個數據庫沒有相同的表格,其中一些有3個字段,其中一些具有多達10個。還有10多個數據庫具有內置功能來添加新數據庫,所以它沒有意義手動爲每個數據庫創建一個模型。另外,我只是將db_used = request.GET.get('database')添加到我現有的views.py文件中,但瀏覽器 – user3799658 2015-02-24 02:43:17

+0

中的用戶輸入沒有提示足夠公平。我想你可能會發現Django是錯誤的工具。建立一個JSON接口需要很多開銷......特別是如果你甚至不打算使用內置模型。相反,我會考慮Flask來爲您的視圖提供服務,並依靠更加程序化的方式訪問數據,例如SQL Alchemy。 – dylrei 2015-02-24 15:38:45

相關問題