>假设我有一个Person
模型,它有一个名字字段和一个姓氏字段。会有很多人有相同的名字。我想编写一个 TastyPie 资源,它允许我获取唯一名字的列表(没有重复)。
直接使用 Django 模型,您可以通过说 Person.objects.values("first_name").distinct()
之类的话轻松做到这一点。我如何使用TastyPie实现同样的事情?
更新
我已经调整了下面链接的apply_filters方法,以便在进行distinct
调用之前使用这些值。
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
.
原始响应
这里有一个很好的解决方案来解决问题的distinct
部分,涉及 apply_filters
的轻度覆盖。
我很惊讶我没有看到一种过滤返回哪些字段的巧妙方法,但您可以通过在序列化之前覆盖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
)。