4

ユーザーに基づくデータ用の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

ここでやりたいことは、toppingsリストをpizzaフィールドTopping.used_byでフィルタリングすることです。このフィールドを request unrelated data でフィルタリングする方法を見つけました。

tastypieリクエストデータで関係フィールドをフィルタリングするにはどうすればよいですか?

4

1 に答える 1

2

最後に、tastypie のコードをステップ実行して答えを見つけました。ToManyリレーションの定義のモデル フィールド(topping_setここ) を callable に設定できることがわかりました。

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

それだけです!

于 2013-01-26T00:48:26.597 に答える