2013-01-19 46 views
4

我正在用tastypie爲基於用戶的數據創建一個django應用程序的API。資源是這樣的:如何通過request.user過濾django-tastypie的ToManyField?

class PizzaResource(ModelResource): 
    toppings = fields.ToManyField(
       'project.app.api.ToppingResource', 
       'topping_set' 
      ) 

    class Meta: 
     authentication = SessionAuthentication() 
     queryset = Pizza.objects.all() 

    def apply_authorization_limits(self, request, object_list): 
     return object_list.filter(users=request.user) 


class ToppingResource(ModelResource): 
    pizza = fields.ForeignKey(PizzaResource, 'pizza') 

    class Meta: 
     authentication = SessionAuthentication() 
     queryset = Topping.objects.filter() 

的根據模型是這樣的:

class Pizza(model): 
    users = ManyToManyField(User) 
    toppings = ManyToManyField(Topping) 
    # other stuff 

class Topping(Model): 
    used_by = ManyToManyField(User) 
    # other stuff 

現在我想要做的就是篩選列出pizzaTopping.used_bytoppings。我剛剛找到了how to filter this field by request unrelated data

如何通過請求數據篩選tastypie的關係字段?

回答

2

最後,我通過逐步瀏覽tastypie的代碼找到答案。原來,ToMany關係(topping_set這裏)的定義中的模型字段可以設置爲可調用的。

在可調用函數中,您只能獲取用於對結果數據進行脫水的bundle數據。在此bundle內部始終是請求,因此我想使用user實例進行過濾。

所以我所做的就是改變這個:

toppings = fields.ToManyField(
    'project.app.api.ToppingResource', 
    'topping_set' 
) 

這樣:

toppings = fields.ToManyField(
    'project.app.api.ToppingResource', 
    lambda bundle: Topping.objects.filter(
     pizza=bundle.obj, 
     used_by=bundle.request.user 
    ) 
) 

,就是這樣!

+1

任何方式來做到這一點,但它不會查詢所有的對象?在我執行prefetch_related之前......例如在我的查詢集中,我正在執行一個prefetch_related('topping_set'),這意味着對所有對象進行一次查詢。現在,但是它爲每個返回的對象進行查詢... – abisson