【问题标题】:How to filter ToManyField of django-tastypie by request.user?如何通过request.user过滤django-tastypie的ToManyField?
【发布时间】:2013-01-03 05:48:58
【问题描述】:

我正在为 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

现在我要做的是通过Topping.used_by 字段过滤pizza 列出的toppings。我刚刚找到how to filter this field by request unrelated data

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

【问题讨论】:

    标签: python django rest tastypie


    【解决方案1】:

    最后,我通过单步执行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
        )
    )
    

    就是这样!

    【讨论】:

    • 有什么方法可以做到这一点,但它不会查询所有对象?在我做一个 prefetch_related 之前......例如在我的查询集中,我正在做一个 prefetch_related('topping_set'),这意味着对所有对象的一次查询。但是现在它对返回的每个对象进行查询...
    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多