使用TastyPie过滤不同的字段

时间:2012-11-21 02:37:48

标签: django tastypie

假设我有一个Person模型,它有一个名字字段和一个姓氏字段。会有很多人拥有相同的名字。我想写一个TastyPie资源,它允许我获取一个唯一的名字列表(没有重复)。

直接使用Django模型,您可以通过Person.objects.values("first_name").distinct()之类的内容轻松完成此操作。我如何用TastyPie实现同样的目标?

1 个答案:

答案 0 :(得分:2)

<强>更新

我已经调整了下面链接的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部分有一个很好的解决方案,here涉及轻量覆盖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)。