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

标签 python django rest tastypie

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

相关文章:

python - 如何用 Python 中的其他多项式替换多项式中的 x?

python - 无法将帧从相机流式传输到 QML

python - 带参数的django redirect()

php - REST/SOAP 性能是否足够快,适合在 PHP 应用程序之间使用

java - 通过 REST 服务发送 ByteArrayOutputStream 时出现 NoMessageBodyWriterFoundFailure

python - 如何将数组保存到格式为 f10.0 的文本文件中?

python - 将报告指标(数据库查询等)的 Django 性能测试套件

python - Django 为 url 查询字符串设置书签

python - Django 有没有像 Ruby on Rails 有 Heroku 这样的东西

android - 哪个是适用于 Android 的最佳 SIP 兼容编解码器类型