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!