2012-04-13 3 views
3

Учитывая следующее определение API, мне нужно иметь возможность фильтровать события по псевдониму продукта.Как фильтровать результаты API связанным атрибутом модели с помощью Tastypie?

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

api.py:

class ProductResource(ModelResource): 

    class Meta: 
     queryset = Product.objects.all() 
     resource_name = 'product' 
     allowed_methods = ['get'] 
     excludes = ['created_at','updated_at'] 
     filtering = { 
      'alias': ALL 
     } 

class EnvironmentResource(ModelResource): 

    class Meta: 
     queryset = Environment.objects.all() 
     resource_name = 'environment' 
     allowed_methods = ['get'] 
     excludes = ['created_at','updated_at'] 

class JobResource(ModelResource): 

    product = fields.ForeignKey(ProductResource, 'product') 

    class Meta: 
     queryset = Job.objects.all() 
     resource_name = 'job' 
     allowed_methods = ['get'] 
     excludes = ['created_at','updated_at'] 

class EventResource(ModelResource): 

    environment = fields.ForeignKey(EnvironmentResource, 'environment',full=True) 
    job = fields.ForeignKey(JobResource, 'job',full=True) 

    class Meta: 
     queryset = Event.objects.all() 
     resource_name = 'event' 
     allowed_methods = ['get'] 
     excludes = ['created_at','updated_at'] 
     filtering = { 
      HOW DO I FILTER BY PRODUCT ALIAS???? 
     } 

ответ

11

Учитывая следующие функции фильтрации:

# In EventResource 
filtering = { 
    'job' : ALL_WITH_RELATIONS 
} 

# In JobResource 
filtering = { 
    'product' : ALL_WITH_RELATIONS 
} 

# In ProductResource 
filtering = { 
    'alias' : ALL 
} 

Вы должны быть в состоянии сделать:

/api/events/job__product__alias=something 
+0

Я понимаю, как это должно работать, но я получаю ошибку синтаксиса на фильтре продукта в JobResource. –

+0

Значит, вы могли бы поделиться с нами сообщением об ошибке? – kgr

+0

'SyntaxError в/ неправильном синтаксисе (api.py, строка 34) Запроса Метод: \t GET Request URL: \t http://127.0.0.1:8000/ Джанго Версии: \t 1.3.1 Исключения Тип: \t SyntaxError Значение исключения: \t Недопустимый синтаксис (api.py, строка 34) ' –

0

Простой способ для достижения этой цели является Advanced Filtering. Это позволяет избежать многих запросов, генерируемых полями tastypie ForeignKey. Для обеспечения безопасности не забудьте вручную проверить или очистить входные данные фильтра, прежде чем добавлять данные в orm_filters.

class EventResource(ModelResource): 

    class Meta: 
     queryset = Event.objects.all() 
     resource_name = 'event' 
     allowed_methods = ['get'] 

    def build_filters(self, filters=None): 

     if filters is None: 
      filters = {} 

     orm_filters = super(EventResource, self).build_filters(filters) 

     # Your filtering 
     if 'job__product__alias' in filters: 
      orm_filters['job__product__alias'] = filters.get(
       'job__product__alias') 

    return orm_filters 

Их вы должны быть в состоянии получить отфильтрованные результаты делают:

/api/events/?job__product__alias=something