2012-07-31 53 views
1

在下面提供的示例中:https://stackoverflow.com/a/10022244/1386588我遇到了所提供示例代码的问题。为什么我无法将自定义键/值对添加到TastyPie高级过滤器定义中的orm_filters?

我已经制定了以下高级过滤器定义:

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

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

     if('query' in filters): 
      query = filters['query'] 
      print query 
      qset = (
        Q(comment__icontains=query) | 
        Q(media_text__icontains=query) 
        ) 
      orm_filters.extend({'custom': qset}) 

而且我遇到问题的事实是orm_filters是一个字典映射,而不是一个列表。因此,我得到的错误:

"error_message": "'dict' object has no attribute 'extend'" 

如果我尝试添加键值对,因为我有定期的dict对象:

orm_filters['custom'] = qset 

我收到以下错误,当我尝试以增加“自定义”键后return orm_filters

"error_message": "Cannot resolve keyword 'custom' into field. Choices are: comment, id, media_text, ..." 

什么我做错了任何想法?

我一直在试图找到一个解决方案,这一段时间没有任何运气,在此先感谢您的帮助!

UPDATE:我认为这个问题是,我试图重写apply_filters没有实例:

def apply_filters(self, request, applicable_filters): 
     print 'applied filters' 
     if 'custom' in applicable_filters: 
      custom = applicable_filters.pop('custom') 
     else: 
      custom = None 

     semi_filtered = super(TaggedResource, self).apply_filters(request, applicable_filters) 

     return semi_filtered.filter(custom) if custom else semi_filtered 

这可能是为什么我收到了无法解析关键词“自定义”的错误,因为我期待apply_filters方法在从applicable_filters中获取后删除'custom'。

不知道我的apply_filters def有什么问题。

回答

1

尝试改变:

orm_filters.extend({'custom': qset}) 

到:

orm_filters.update(**qset) 

更新:(测试代码)

def build_filters(self, filters=None): 
    filters = filters 

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

    query = filters.get('query') 
    if query: 
     qset = (
      Q(comment__icontains=query) | 
      Q(media_text__icontains=query) 
     ) 
     applicable_filters['custom'] = qset 

    return applicable_filters 

def apply_filters(self, request, applicable_filters): 
    custom = None 
    if 'custom' in applicable_filters: 
     custom = applicable_filters.pop('custom') 

    semi_filtered = super(TaggedResource, self).apply_filters(request, applicable_filters) 

    return semi_filtered.filter(**custom) if custom else semi_filtered 
+0

我想你放什么,但我需要有一个关键('custom')。 'orm_filters.update(** {'custom':qset})'用于将带有Q对象的'自定义'添加到字典中,因为它是值对,但是当我尝试返回时它仍然给出与以前相同的错误它:''error_message“:”无法解析关键字'自定义'到字段中。选择是:comment,...“' – bevinlorenzo 2012-07-31 14:37:11

+0

Offcourse你得到那个消息,自定义不是一个字段,你不能过滤那些不不存在,你为什么这样做? – 2012-07-31 14:43:36

+0

我认为这样可以,因为我只是将它添加到'build_filters'中的映射中。该过滤器实际上并没有运行“自定义” - [如此处所示](http://stackoverflow.com/a/10022244/1386588),我已将“自定义”传递到适用的过滤器后关闭。 'custom = applicable_filters.pop('custom')' – bevinlorenzo 2012-07-31 15:08:16

相关问题