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