假設我有一個Person
模型,該模型具有名字字段和姓氏字段。會有很多人擁有相同的名字。我想寫一個TastyPie資源,它可以讓我得到一個唯一的名字列表(沒有重複的)。使用TastyPie過濾不同的字段
直接使用Django模型,您可以輕鬆地通過說出類似Person.objects.values("first_name").distinct()
的內容來完成此操作。我如何與TastyPie實現相同的目標?
假設我有一個Person
模型,該模型具有名字字段和姓氏字段。會有很多人擁有相同的名字。我想寫一個TastyPie資源,它可以讓我得到一個唯一的名字列表(沒有重複的)。使用TastyPie過濾不同的字段
直接使用Django模型,您可以輕鬆地通過說出類似Person.objects.values("first_name").distinct()
的內容來完成此操作。我如何與TastyPie實現相同的目標?
更新
我已經適應下面鏈接使得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
光覆蓋問題here的distinct
一部分。
我很驚訝我沒有看到過濾返回哪些字段的流暢方式,但是您可以通過覆蓋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
)。
這種方法不會消除重複的名稱,因爲'distinct'操作首先發生,所以我得到截然不同的'Person'對象,而不是'first_names'。 – keathmilligan
SO不讓我回答這個問題,但它看起來像ModelResource在這種情況下無法做到我所需要的,所以我通過派生'Resource'來創建一個自定義資源。 – keathmilligan