¿Cómo filtrar ToManyField de django-tastypie por request.user?

Estoy creando una API con tastypie para una aplicación de django para datos basados ​​en el usuario. Los recursos son así:

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

Los modelos correspondientes son así:

 class Pizza(model): users = ManyToManyField(User) toppings = ManyToManyField(Topping) # other stuff class Topping(Model): used_by = ManyToManyField(User) # other stuff 

Ahora lo que quiero hacer es filtrar las toppings enumeradas con pizza por el campo Topping.used_by . Acabo de encontrar cómo filtrar este campo solicitando datos no relacionados .

¿Cómo puedo filtrar un campo de relación de tastypie por datos de solicitud?

Finalmente encontré la respuesta pasando por el código de tastypie. Resultó que el campo del modelo en la definición de la relación topping_set ( topping_set aquí) se puede establecer en un llamable.

Dentro de la llamada se obtiene como único parámetro el bundle de datos utilizados para deshidratar los datos resultantes. Dentro de este bundle siempre está la solicitud y, por lo tanto, la instancia de user que quiero usar para filtrar.

Así que lo que hice fue cambiar esto:

 toppings = fields.ToManyField( 'project.app.api.ToppingResource', 'topping_set' ) 

a esto:

 toppings = fields.ToManyField( 'project.app.api.ToppingResource', lambda bundle: Topping.objects.filter( pizza=bundle.obj, used_by=bundle.request.user ) ) 

¡y eso es todo!