私は現在、バックエンドでDjango-Rest-Frameworkを使用し、フロントエンドでEmber.js/Ember-dataを使用するプロジェクトを作成しています。
この形式で、emberアプリからdjangoapiにクエリを返したいと思っています。
http://myurl.com/application/api/model/?parameter=X
ここで、parameterは照会対象のモデルのフィールドであり、Xは検索する値です。
このような大まかなものが結果のクエリになるはずです
queryset = Model.objects.filter(**request.QUERY_PARAMS.dict())
ここで、QUERY_PARAMS.dict()は、次の形式の辞書を提供するDjango構文です。
{parameter:X}
** Djangoが期待するように、dictをキーワード引数に変換します。
したがって、上記の行は事実上次のようになります。
queryset = Model.objects.filter(parameter=X)
私はすでにカスタムビューとカスタムミックスインを使用してこれを機能させていますが、クエリ処理の実装が少し単純である可能性があり、これは非常に一般的なパターンとして私を襲うのではないかと心配しています。
Django用のライブラリがあるのか、それともDjangoの内部にあるのか、カスタムクエリセットコードなしでこれらの比較的一般的なクエリを処理できるのか、完全には理解していないのでしょうか。
正しい方向へのポインタをいただければ幸いです。
スティーブケイン
編集:
def get_integer_queryset(self, query, queryset):
#stringify the first entry in query.keys (query is request.QUERY_PARAMS)
query_key = str(query.keys()[0])
#split the string into individual strings since the request object dict
#contains only a string of numbers and not an actual array (see below)
#query = {'parameter':'1,2,3,4'} becomes {'parameter':['1','2','3','4']}
query_values = query.get(query_key, None).split(",")
#construct two dicts. One handles integers and the other handles "null"
#all the code below is required because Django does not seem to handle "null"
#as a valid query to a field that is type "integer"
#as a side note, I think this is poor and create annoying work...i would love
#to be wrong here
#the Q objects are required in order to compose a query of both integers and
#the string "null"
query_vals_no_null = {query_key+"__in": []}
optional_null_dict = {}
for value in query_values:
if value == "null" or value == "None":
optional_null_dict[query_key+"__isnull"] = True
else:
query_vals_no_null[query_key+"__in"].append(value)
return queryset.filter( Q(**query_vals_no_null) |
Q(**optional_null_dict) )
これは、整数クエリを処理するカスタムビューから取得した主要なメソッドです。何が起こっているのかを明確にするためにコメントを挿入しました。これがおなじみの/ひどい/素晴らしい/やや穏やかに大丈夫に見えるかどうか教えてください。
スティーブ