[英]How to query on attribute of ToManyField with django-tastypie
[英]How to filter ToManyField of django-tastypie by request.user?
我正在為基於用戶的數據的django應用程序構建一個帶有密碼的API。 資源如下:
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
現在我要做的是通過Topping.used_by
字段過濾pizza
列出的toppings
。 我只是找到了如何通過請求不相關的數據來過濾此字段 。
如何通過請求數據過濾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
)
)
就是這樣!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.