我正在进行金字塔遍历项目,我希望运行不同的查询,以便在其父级左右检索相同的资源库。
假设我有3个资源:客户,商店,订单。现在Customer和Store都可以有一个Orders列表。所以我将OrderListResource定义为资源,我的视图如下:
@view_config(context=resources.OrderListResource, renderer='json')
def view_order_list(context, request):
return {orders: context.retrieve_method()}
现在我想知道在资源父级上检索数据库的最佳做法是什么? 例如,OrderListResource应如何决定按客户ID或商店ID检索订单。逻辑应该在视图还是资源本身? 感谢。
答案 0 :(得分:1)
好吧,既然您正在使用遍历,那么访问资源的父级非常简单:
parent = context.__parent__
query = session.query(OrderList)
if isinstance(parent, CustomerResource):
query = query.filter(OrderList.customer_id == parent.id)
elif isinstance(parent, StoreResource):
query = query.filter(OrderList.store_id == parent.id)
如果要检查的父级可能不是资源的直接父级,则可以使用pyramid.traversal.find_interface方法。
或者,如果逻辑差异很大,具体取决于订单是否包含在客户或商店中,您可以使用containment
视图谓词创建两个单独的视图。
@view_config(context=resources.OrderListResource, containment=CustomerResource, renderer='json')
def view_order_list_for_customer(context, request):
return ...
@view_config(context=resources.OrderListResource, containment=StoreResource, renderer='json')
def view_order_list_for_store(context, request):
return ...
答案 1 :(得分:1)
鉴于资源树中的每个资源都具有标识,那么名为OrderListResource
的资源的目的和身份是什么?
要在遍历期间将资源匹配为上下文,必须先创建它。是否要在对真实资源进行CRUD操作时更新这些资源?这就是为什么我将OrderListResource
背后的想法理解为由于应用程序运行时的动态查询而导致的Order资源集合。
您想存储客户,商店和订单。每个客户,商店和订单都有一个标识,使您可以在集合中查找该项目。您可以创建这样的资源树。
root (/) (Root Resource)
|- customers (Container supporting traversal)
|- stores (Container supporting traversal)
|- orders (Container supporting traversal)
遍历资源树的网址格式
/customers/{uid}
/stores/{uid}
/orders/{uid}
鉴于您在store
资源中保存了与customer
和order
的关系,如何使用符合现有网址的自然网址格式查询资源之间的关系模式?
/customers/{uid}/orders
/stores/{uid}/orders
查找单个客户的订单
@view_config(name='orders', context=resources.Customer, renderer='json')
def view_order_list_for_customer(context, request):
customer = context.__name__
orders = request.root['orders']
orders_by_customer = [order for order in orders if order.customer == customer]
return dict(orders = orders_by_customer)
从单个商店查找订单
@view_config(name='orders', context=resources.Store, renderer='json')
def view_order_list_for_store(context, request):
store = context.__name__
orders = request.root['orders']
orders_by_store = [order for order in orders if order.store == store]
return dict(orders = orders_by_store)
这些视图为location-aware,可让您使用来自给定上下文的信息创建查询。
请注意,视图名称与包含所有Order
资源的资源的名称相匹配。
要探索您的网址通常看起来像两个资源之间的关系
/resource/identifier/resource