好吧,我的回答有点含糊,所以我将发布如何用一些代码解决问题:
假设我想创建一个具有某些属性的机场资源。我将在 3 个不同的文件中构建它(出于可读性原因)。
该文件将包含所有资源属性和一个构造函数:
from models import *
class Airport(object):
def __init__ (self, iata, icao, name, asciiName, geonamesId, wikipedia, id, latitude, longitude):
self.icao = icao
self.iata = iata
self.name = name
self.geonamesId = geonamesId
self.wikipedia = wikipedia
self.id = id
self.latitude = latitude
self.longitude = longitude
self.asciiName = asciiName
该文件将用于创建资源。
然后是第二个文件::AirportResource.py
这个文件将包含资源属性和一些基本方法,具体取决于我们希望资源处理的请求。
class AirportResource(Resource):
iata = fields.CharField(attribute='iata')
icao = fields.CharField(attribute='icao')
name = fields.CharField(attribute='name')
asciiName = fields.CharField(attribute='asciiName')
latitude = fields.FloatField(attribute='latitude')
longitude = fields.FloatField(attribute='longitude')
wikipedia= fields.CharField(attribute='wikipedia')
geonamesId= fields.IntegerField(attribute='geonamesId')
class Meta:
resource_name = 'airport'
object_class = Airport
allowed_methods=['get', 'put']
collection_name = 'airports'
detail_uri_name = 'id'
def detail_uri_kwargs(self, bundle_or_obj):
kwargs = {}
if isinstance(bundle_or_obj, Bundle):
kwargs['id'] = bundle_or_obj.obj.id
else:
kwargs['id'] = bundle_or_obj.id
return kwargs
如文档中所述,如果我们想创建一个处理 CREATE、GET、PUT、POST 和 DELETE 请求的 API,我们必须覆盖/实现以下方法:
def obj_get_list(self, bundle, **kwargs)
: 获取对象列表
def obj_get(self, bundle, **kwargs)
: 获取单个对象
def obj_create(self, bundle, **kwargs)
创建对象(CREATE 方法)
def obj_update(self, bundle, **kwargs)
更新对象(PUT 方法)
def obj_delete(self, bundle, **kwargs)
删除对象(DELETE 方法)
(见http://django-tastypie.readthedocs.org/en/latest/non_orm_data_sources.html)
通常,在ModelResource
所有这些方法中都已定义和实现,因此可以毫无困难地直接使用它们。但是在这种情况下,它们应该根据我们想要做的来定制。
让我们看一个实现obj_get_list
and的例子obj_get
:
对于 obj_get_list:
在ModelResource
中,数据首先从数据库中获取,然后可以根据 META 类中声明的过滤器进行过滤(参见http://django-tastypie.readthedocs.org/en/latest/interacting.html)。但我不希望实现这样的行为(获取所有内容然后过滤),所以我根据查询字符串参数对 Neo4j 进行了查询:
def obj_get_list(self,bundle, **kwargs):
data=[]
params= []
for key in bundle.request.GET.iterkeys():
params.append(key)
if "search" in params :
query= bundle.request.GET['search']
try:
results = manager.searchAirport(query)
data = createAirportResources(results)
except Exception as e:
raise NotFound(e)
else:
raise BadRequest("Non valid URL")
return data
对于 obj_get:
def obj_get(self, bundle, **kwargs):
id= kwargs['id']
try :
airportNode = manager.getAirportNode(id)
airport = createAirportResources([airportNode])
return airport[0]
except Exception as e :
raise NotFound(e)
最后是一个通用函数,它以节点列表为参数并返回 Airport 对象列表:
def createAirportResources(nodes):
data= []
for node in nodes:
iata = node.properties['iata']
icao = node.properties['icao']
name = node.properties['name']
asciiName = node.properties['asciiName']
geonamesId = node.properties['geonamesId']
wikipedia = node.properties['wikipedia']
id = node.id
latitude = node.properties['latitude']
longitude = node.properties['longitude']
airport = Airport(iata, icao, name, asciiName, geonamesId, wikipedia, id, latitude, longitude)
data.append(airport)
return data
- 现在是第三个
manager.py
:负责对数据库进行查询并返回结果:
首先,我使用neo4j rest client
框架获得了一个数据库实例:
from neo4jrestclient.client import *
gdb= GraphDatabase("http://localhost:7474/db/data/")
然后是获取机场节点的函数:
def getAirportNode(id):
if(getNodeType(id) == type):
n= gdb.nodes.get(id)
return n
else:
raise Exception("This airport doesn't exist in the database")
以及执行搜索的那个(我正在使用服务器插件,有关更多详细信息,请参阅 Neo4j 文档):
def searchAirport(query):
airports= gdb.extensions.Search.search(query=query.strip(), searchType='airports', max=6)
if len(airports) == 0:
raise Exception('No airports match your query')
else:
return results
希望这会有所帮助:)