将过滤器组合到Tastypie中的一个查询中

时间:2012-07-27 22:01:31

标签: django tastypie

  

可能重复:
  Django Tastypie Advanced Filtering: How to do complex lookups with Q objects

我有一个tastypie modelRseource,如下所示:

class TaggedResource(ModelResource):
    tags = ListField()
    user = fields.ForeignKey(UserProfileResource, 'user')

    class Meta:
        queryset = Media.objects.all().order_by('-timestamp')
        authorization = MediaAuthorization()
        detail_allowed_methods = ['get', 'post', 'put', 'delete','patch']

    filtering = {
        #'user': ALL_WITH_RELATIONS,
        #exact is date, lt is less than lte less than equal to, etc
        'timestamp': ['exact', 'range', 'lt', 'lte', 'gte', 'gt'],
        'social_source': ALL,
        'media_type': ALL,
        'comment': ['exact', 'startswith', 'endswith', 'contains'],
        'media_text': ['exact', 'startswith', 'endswith', 'contains'],
    }

我需要在过滤器之间使用OR运算符,并且希望将查询合并到一个参数中。例如,我想从注释字段OR media_text字段返回包含单词“test”过滤的对象。

这是理想的:http:mysite.com/api/v1/tagged?q = test

其中'q'对两个字段执行OR过滤。

这可行吗?

更新:这是我正在使用的高级过滤器,但我不确定如何获得OR语句:

def build_filters(self, filters=None):
    if filters is None:
        filters = {}

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

    if 'q' in filters:
        orm_filters['comment__contains'] = filters['q']
        orm_filters['media_text__contains'] = filters['q'] 
    return orm_filters  

2 个答案:

答案 0 :(得分:4)

你通过覆盖build_filters做正确的事情,你可以使用django的Q类进行AND / OR查询,我在这里回答了类似的问题

Tastypie filtering with multiple values

这是另一个有趣的问题:

Tastypie Negation Filter

答案 1 :(得分:1)

我建议看Advanced Filtering即使我不确定它是否可行。 但是如果你覆盖build_filters,你可以访问整个资源,并且有可能定义这样的过滤器,这些过滤器不仅仅是字段。