2012-11-21 58 views
2

假設我有一個Person模型,該模型具有名字字段和姓氏字段。會有很多人擁有相同的名字。我想寫一個TastyPie資源,它可以讓我得到一個唯一的名字列表(沒有重複的)。使用TastyPie過濾不同的字段

直接使用Django模型,您可以輕鬆地通過說出類似Person.objects.values("first_name").distinct()的內容來完成此操作。我如何與TastyPie實現相同的目標?

+0

SO不讓我回答這個問題,但它看起來像ModelResource在這種情況下無法做到我所需要的,所以我通過派生'Resource'來創建一個自定義資源。 – keathmilligan

回答

2

更新

我已經適應下面鏈接使得distinct調用之前使用的值的apply_filters方法。

def apply_filters(self, request, applicable_filters): 
    qs = self.get_object_list(request).filter(**applicable_filters) 

    values = request.GET.get('values', '').split(',') 
    if values: 
     qs = qs.values(*values) 

    distinct = request.GET.get('distinct', False) == 'True' 
    if distinct: 
     qs = qs.distinct() 

    return qs 

values回報字典而不是模型對象,所以我不認爲你需要重寫alter_list_data_to_serialize

原始響應

有一個很好的解決方案涉及apply_filters光覆蓋問題heredistinct一部分。

我很驚訝我沒有看到過濾返回哪些字段的流暢方式,但是您可以通過覆蓋alter_list_data_to_serialize並在序列化之前從對象中刪除不需要的字段來實現該功能。

def alter_list_data_to_serialize(self, request, data): 
    data = super(PersonResource, self).alter_list_data_to_serialize(request, data) 
    fields = request.GET.get('fields', None) 
    if fields is not None: 
     fields = fields.split(',') 
     # Data might be a bundle here. If so, operate on data.objects instead. 
     data = [ 
      dict((k,v) for k,v in d.items() if k in fields) 
      for d in data 
     ] 
    return data 

把這兩個結合起來使用類似/api/v1/person/?distinct=True&values=first_name的東西來得到你想要的東西。這將大體上工作,並將仍然與額外的過濾(&last_name=Jones)。

+0

這種方法不會消除重複的名稱,因爲'distinct'操作首先發生,所以我得到截然不同的'Person'對象,而不是'first_names'。 – keathmilligan