Django Tastypie – фильтрация ресурса ToManyField с параметром URL

Я работаю над внедрением API для моего приложения Django (v1.5), используя Tastypie. Я хотел бы иметь возможность фильтровать / ограничивать связанные ресурсы, которые я получаю, когда родительский ресурс.

Вот мои (упрощенные) модели:

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

Мои ресурсы:

 # 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, } 

Я хотел бы иметь возможность фильтровать ресурсы данных «datetime» внутри ресурса пользователя с помощью параметра URL, например:

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

или

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

для получения номера пользователя, часового пояса , идентификатора устройства и списка данных, отфильтрованных с данным дате .

Я не хочу, чтобы каждый раз запрашивать ресурсы данных для их фильтрации, я хочу, чтобы все это было включено в ресурс пользователя . Есть ли способ реализовать фильтр, примененный к вложенному ресурсу с использованием фреймворка?

Спасибо за ваше время, я буду благодарен за любое предложение!

Вы можете расширить свой аргумент attribute вы передали в поле data с полномасштабной функцией и повторно использовать 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 обрабатывает создание и применение фильтров, как определено для вашего DataResource . Вам просто нужно отфильтровать его дальше по parent_id .

Ссылка .