我正在为django app构建一个带有tastypie的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
现在我要做的是过滤toppings
字段pizza
列出的Topping.used_by
。我刚刚找到how to filter this field by request unrelated data。
如何按请求数据过滤tastypie
的关系字段?
答案 0 :(得分:2)
最后,我通过逐步完成了tastypie的代码找到了答案。事实证明,ToMany
关系定义中的模型字段(此处为topping_set
)可以设置为可调用。
在callable中,您只获得用于对结果数据进行脱水的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
)
)
就是这样!