Django ORM filter()の運用詳細


最近コードを発表した時、Pythonのエヴァ関数の危険性を発見しました。
queryset=eval("models.TusserInfo.objects.filter({0})[{1}:{2}]format(select,page_)num*page-page_num,page_num*page)
コードシーン:
これは情報を得るためのAPIです。データベースから対応情報を取る必要があります。しかし、どのフィールドから情報を得るかは分かりません。ユーザによって入る必要があります。ここではエヴァ関数はある人に良い侵入性を提供します。他の方法でコードを改良します。
filter(***kwargs):与えられたフィルタ条件にマッチするオブジェクトが含まれています。
条件クエリー
条件は、パラメータ、辞書、Qです。

  def filter(self, *args, **kwargs):
    """
    Returns a new QuerySet instance with the args ANDed to the existing
    set.
    """
    return self._filter_or_exclude(False, *args, **kwargs)
そこで、辞書の値を伝える方式に変えました。コードを文字列化してからコード化するのを避けました。
dictで呼び出して、dictは辞書でなければなりません。
queryset=models.TserInfo.objects.filter(**field_)dict)[page_]num*page-page_num:page_num*page]
他の方法でormを使うとは思わなかったので、ちょっと珍しいです。辞書で値を伝えるのもいいです。
補足知識:django ormクエリにおけるfilterとgetの違い
パラメータを入力:
getのパラメータはmodelで定義されているどのフィールドだけですか?厳密なマッチングだけをサポートします。
filterのパラメータは、フィールドであっても良いし、in、likeなどの拡張されたwhereクエリキーであっても良い。
戻り値:
get戻り値は定義されたmodelオブジェクトです。
filter戻り値は新しいQuerySetオブジェクトであり、QuerySetはクエリを行って新しいQuerySetオブジェクトに戻り、チェーン操作をサポートします。QuerySetは1セットのオブジェクトで、反復または巡回、スライスなどが使用できますが、listタイプには等しくないです。
異常:
getはレコードが一つしかない場合は正常です。つまり、getクエリーフィールドはメインキーまたは一意制約のフィールドでなければならないということです。複数の記録を返したり、記録が見つからなかったりした場合は異常を投げます。
getメソッドはデータベースからマッチを取得した結果、オブジェクトを返します。記録が存在しないとエラーが発生し、複数のレコードがあってもエラーが発生します。
filterにマッチした記録がありますか?
filterメソッドはデータベースからマッチングを取得した結果、オブジェクトリストを返します。記録が存在しない場合は[]に戻ります。
また、他の資料から見たfilterにはキャッシュデータの機能があるようです。初めてデータベースを調べてキャッシュを生成します。今度はfilterメソッドを呼び出すと、キャッシュのデータを直接取得します。
以上のDjango ORM filterの運用の詳細は、小編集が皆さんに提供している内容の全てです。参考にしていただければと思います。どうぞよろしくお願いします。