4

我正在为基于用户的数据的 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

现在我要做的是按字段过滤toppings列出的内容。我刚刚找到了如何通过请求不相关的数据来过滤这个字段pizzaTopping.used_by

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

4

1 回答 1

2

最后我通过单步执行tastepie的代码找到了答案。事实证明,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
    )
)

就是这样!

于 2013-01-26T00:48:26.597 回答