如何通过request.user过滤django-tastypie的ToManyField?

时间:2013-01-19 18:04:52

标签: python django rest tastypie

我正在为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的关系字段?

1 个答案:

答案 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
    )
)

就是这样!