2014-02-10 22 views
2

在脫水過程中,我創建一個自定義值:如何篩選脫水期間創建的自定義值?

def dehydrate(self, bundle): 
    bundle.data['custom_field'] = ["add lots of stuff and return an int"] 
    return bundle 

,我想過濾的。

/?format=json&custom_field__gt=0... 

但是我得到了"[custom_field] field has no 'attribute' for searching with."

也許我誤解自定義過濾器的錯誤,但在這兩種build_filtersapply_filters我似乎無法獲得訪問我的自定義字段上進行篩選。在我見過的例子中,似乎我不得不重做所有在build_filters中脫水完成的工作,例如

for all the items: 
    item['custom_field'] = ["add lots of stuff and return an int"] 
    filter on item and add to pk_list 

orm_filters["pk__in"] = [i.pk for i in pk_list] 

這似乎是錯誤的,因爲我在做兩次工作。我錯過了什麼?

回答

1

問題是脫水是按設計「每個對象」,而過濾器是按照object_list。這就是爲什麼你必須手動過濾並重做脫水工作。

你可以把它想象這樣的:

# Whole table 
[obj, obj1, obj2, obj3, obj4, obj5, obj5] 

# filter operations 
[...] 

# After filtering 
[obj1, obj3, obj6]  

# Returning 
[dehydrate(obj), dehydrate(obj3), dehydrate(obj5)] 

此外,如果你通過過濾取,你會得到讓說100個對象,你可以想像。例如100000條記錄在整個表上觸發脫水效率會非常低。

也許在模型中創建新列可能是候選解決方案,如果你打算使用很多過濾器,排序等。我猜這是它的一種統計信息在這個領域,所以如果不是新列,那麼也許django aggregation可以緩解你的痛苦一點。