如何通过request.user过滤Django的tastypie的ToManyField?(How

2019-07-18 10:31发布

我建立与tastypie一个API,基于用户数据的Django应用程序。 资源是这样的:

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与上市pizzaTopping.used_by场。 我刚刚找到了如何通过请求不相关的数据这一领域过滤 。

如何过滤的关系字段tastypie通过请求数据?

Answer 1:

最后,我通过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
    )
)

那就是它!



文章来源: How to filter ToManyField of django-tastypie by request.user?