簡體   English   中英

如何通過request.user過濾django-tastypie的ToManyField?

[英]How to filter ToManyField of django-tastypie by request.user?

我正在為基於用戶的數據的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 我只是找到了如何通過請求不相關的數據來過濾此字段

如何通過請求數據過濾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
    )
)

就是這樣!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM