このような並外れた結果に感銘を受け、自分のプロジェクトのパフォーマンスを懸念して、私は自分のプロジェクトにPony ORMを実装することにしました。 それから来たものは、ロールを参照してください。
誘惑
もちろん、プロジェクトを再度書き直すこともできます。 この誘惑は、使用するツールにルーツがある問題に遭遇した開発者を常に覆い隠します。 ただし、すでに記述されたコードの量、膨大な分岐データモデル、およびプロジェクトで使用されたDjangoの非常に機能するプラグインの印象的な量は、この道に大きく太い十字架をかけました。
代替案
しばらく前、Django ORMの代替案を探して、 Aldjemyの興味深いプロジェクトに出会いました。 これはDjango ORMのごく一部であり、Djangoモデル構造を使用してSQLAlchemyモデルの代替階層を構築できます。 このアプローチにより、プロジェクトの基礎(Djangoデータモデル全体を含む)を維持しながら、SQLAlchemyを正確に、必要な場所でのみ使用できます。 このプロジェクトのアイデアに触発され、
短期遠足
ジョニーの使用は簡単です。 システムにdjonyをインストールした後(たとえば、
pip install git+git://github.com/nnseva/djony.git@master#egg=djony
)、settings.pyで使用されるアプリケーションの1つとしてdjonyを指定できます。 djonyはリストの最新のアプリケーションでなければならないことを覚えておく必要があります。
現在、各Djangoモデル(つまり、クラスとしてのモデル)には属性 `p`(単語ponyから)があります。 これはPony ORMモデルです。 Ponyのドキュメントによると、モデルを使用する必要がある場所ならどこでも使用できます。 ormモジュールも必要になります。これは、ponyモジュールからインポートできます(
from pony import orm
)。 または、djony.ormモジュールのすべての変数、およびdjony固有の関数と変数を含むdjony.ormモジュールを使用できます。
Pony ORMモデルオブジェクトには、データモデルと関係構造に応じたデータフィールドとオブジェクトコレクションのみが含まれます(将来的には、自動的に作成されたPony ORMモデルにメンバーを追加する機能を強化する必要があります)。
テスト
次に、最も一般的な操作の1つであるパフォーマンスのテストを試みましょう-ユーザー権限のチェック。
Djangoの場合は、既製のUser.has_perm関数を使用します。 もちろん、Pony ORMの場合、この関数とほぼ同等のコードを記述する必要があります。
def has_perm(user,perm): if not user.is_active: return False app_label,codename = perm.split('.') for p in orm.select( p for p in Permission.p if (user in p.user_set or user in p.group_set.user_set) and p.codename == codename and p.content_type.app_label == app_label ): return True return False
テスト結果を見てみましょう(テストでは、1000人のユーザーがデータベースで起動され、テスト用のバラストの役割を果たしました)。
>>> import test_pony >>> import test_django >>> test_django.test_django() check user permissions: django req/seq: 170.308759221 req time (ms): 5.8716886 >>> test_pony.test_pony() check user permissions: pony req/seq: 729.517146462 req time (ms): 1.3707697
ご覧のとおり、私たちは4回以上獲得しています。 いいね!
アプリケーション。 テストコード。
test_django.py
import datetime from django.contrib.auth.models import User def test_django(): t1 = datetime.datetime.now() for i in range(10000): test() t2 = datetime.datetime.now() print "check user permissions: django req/seq:",10000/(t2-t1).total_seconds(),'req time (ms):',(t2-t1).total_seconds()/10. def test(): user = User.objects.get(username='testuser') return user.has_perm('auth.add_user')
test_pony.py
import datetime from django.contrib.auth.models import User, Permission def test_pony(): t1 = datetime.datetime.now() for i in range(10000): test() t2 = datetime.datetime.now() print "check user permissions: pony req/seq:",10000/(t2-t1).total_seconds(),'req time (ms):',(t2-t1).total_seconds()/10. from djony import orm @orm.db_session def test(): user = User.p.get(username='testuser') return has_perm(user,'auth.add_user') def has_perm(user,perm): if not user.is_active: return False app_label,codename = perm.split('.') for p in orm.select( p for p in Permission.p if (user in p.user_set or user in p.group_set.user_set) and p.codename == codename and p.content_type.app_label == app_label ): return True return False