我正在为基于用户的数据的 django 应用程序构建一个带有 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
现在我要做的是通过 Topping.used_by
字段过滤与 pizza
一起列出的 toppings
。我刚找到 how to filter this field by request unrelated data .
如何根据请求数据过滤tastypie
的关系字段?
最佳答案
最后我通过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
)
)
就是这样!
关于python - 如何通过request.user过滤django-tastypie的ToManyField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14417202/