使用 TastyPie 过滤不同的字段

Posted

技术标签:

【中文标题】使用 TastyPie 过滤不同的字段【英文标题】:Filter on a distinct field with TastyPie 【发布时间】:2012-11-09 05:56:51 【问题描述】:

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

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

【问题讨论】:

SO 没有让我回答这个问题,但在这种情况下,ModelResource 似乎无法满足我的需求,所以我只是通过派生 Resource 创建了一个自定义资源。跨度> 【参考方案1】:

更新

在调用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

原始回复

对于问题here 的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)。

【讨论】:

这种方法不会消除重复的名称,因为distinct 操作首先发生,所以我得到不同的Person 对象不是不同的first_names

以上是关于使用 TastyPie 过滤不同的字段的主要内容,如果未能解决你的问题,请参考以下文章

Django Tastypie 过滤器 OR 语句

Tastypie:具有复杂查询的高级过滤器

通过外键过滤 Tastypie 资源

包含过滤条件的 Django-tastypie REST url

Tastypie 的距离空间查询

在 django sweetpie 中过滤 GenericForeignKeyField