5

可能重复:
Django Tastypie 高级过滤:如何使用 Q 对象进行复杂查找

我有一个美味的模型资源,看起来像这样:

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 运算符,并且希望将查询组合成一个参数。例如,我想返回包含从评论字段或 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  
4

2 回答 2

4

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

具有多个值的美味过滤

这是另一个有趣的:

Tastypie 否定过滤器

于 2012-07-28T09:32:18.527 回答
1

我建议查看高级过滤,即使我不确定它是否可行。但是,如果您覆盖 build_filters,您就可以访问整个资源,并且可能定义这样的过滤器,这些过滤器不仅限于字段。

于 2012-07-27T23:56:07.040 回答