Django Tastypie – Filtrado del recurso ToManyField con el parámetro URL

Estoy trabajando en la implementación de una API para mi aplicación Django (v1.5) usando Tastypie. Me gustaría poder filtrar / limitar los recursos relacionados que obtengo cuando el recurso principal.

Aquí están mis modelos (simplificados):

# myapp/models.py class User(models.Model): number = models.IntegerField() device_id = models.CharField(verbose_name="Device ID", max_length=255) timezone = models.CharField(max_length=255, blank=True) def data(self, limit=0): result = Data.objects.filter(patient_id = self.id).order_by('-datetime').values('datetime', 'value') if limit != 0: result = result[:limit] return result class Data(models.Model): user = models.ForeignKey(User) datetime = models.DateTimeField() value = models.IntegerField() 

Mis recursos:

 # api/resources.py class DataResource(ModelResource): class Meta: queryset = Data.objects.all() resource_name = 'cgm' fields = ['value', 'datetime'] serializer = Serializer(formats=['json', 'xml']) filtering = { 'datetime': ('gte', 'lte'), } include_resource_uri = False def dehydrate(self, bundle): bundle.data['timestamp'] = calendar.timegm(bundle.data['datetime'].utctimetuple()) return bundle class UserResource(ModelResource): data = fields.ToManyField(DataResource, attribute=lambda bundle: Data.objects.filter(patient_id=bundle.obj.id), full=True, related_name='data', null=True) class Meta: queryset = User.objects.all().order_by('number') resource_name = 'user' fields = ['number', 'timezone', 'device_id'], serializer = Serializer(formats=['json', 'xml']) filtering = { 'data': ALL_WITH_RELATIONS, } 

Me gustaría poder filtrar los recursos de datos por ‘datetime’ dentro del recurso de usuario usando un parámetro de URL, por ejemplo:

 127.0.0.1:8000/api/v1/user/1/?format=json&datetime__gte=2013-11-14%2012:00:00 

o

 127.0.0.1:8000/api/v1/user/1/?format=json&data__datetime__gte=2013-11-14%2012:00:00 

para obtener el número del usuario, la zona horaria , la identificación del dispositivo y la lista de datos filtrados con la fecha y hora especificada .

No quiero tener que consultar los recursos de datos por separado para filtrarlos, quiero que todo esté incluido en el recurso del usuario . ¿Hay alguna forma de implementar un filtro aplicado al recurso nested utilizando el marco?

Gracias por su tiempo, apreciaré cualquier sugerencia!

Puede extender su argumento de attribute que ha pasado al campo de data con una función de escala completa y reutilizar el DataResource :

 def filter_data_items(bundle): res = DataResource() new_bundle = Bundle(request=bundle.request) objs = res.obj_get_list(new_bundle) return objs.filter(parent_id=bundle.obj.pk) 

res.obj_get_list maneja la construcción y aplicación de filtros según lo definido por su DataResource . Solo necesitas filtrarlo más adelante en parent_id .

Referencia .