在资源父级上运行不同的查询

时间:2014-06-16 08:12:57

标签: pyramid traversal

我正在进行金字塔遍历项目,我希望运行不同的查询,以便在其父级左右检索相同的资源库。
假设我有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检索订单。逻辑应该在视图还是资源本身? 感谢。

2 个答案:

答案 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资源中保存了与customerorder的关系,如何使用符合现有网址的自然网址格式查询资源之间的关系模式?

/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