2

Person名フィールドと姓フィールドを持つモデルがあるとします。同姓同名の人も多いでしょう。一意の名のリストを (重複なしで) 取得できる TastyPie リソースを作成したいと考えています。

Django モデルを直接使用すると、次のように言うだけで簡単に実行できますPerson.objects.values("first_name").distinct()。TastyPie で同じことを達成するにはどうすればよいですか?

4

1 に答える 1

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での問題の部分に対する優れた解決策があります。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

これらの 2 つを組み合わせて、次のようなものを使用して、目的のもの/api/v1/person/?distinct=True&values=first_nameを取得します。これは一般的に機能し、追加のフィルタリング ( &last_name=Jones) を使用しても機能します。

于 2012-11-21T03:47:39.167 に答える