36

Django モデルの完全なモジュール パスがなくても、次のようなことは可能ですか。

model = 'User' [in Django namespace]
model.objects.all()

...とは対照的に:

User.objects.all().

編集: コマンドライン入力に基づいてこの呼び出しを実行しようとしています。import ステートメントを避けることは可能ですか?

model = django.authx.models.User

Django がエラーを返さない場合:

"global name django is not defined."
4

6 に答える 6

57

私はあなたがこれを探していると思います:

from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')

もちろん、他の方法もありますが、名前空間にインポートする必要のあるモデルファイルがわからない場合は、これが私が処理する方法です。(モデルがどのアプリに属しているかを最初に知らなければ、モデルを安全に取得する方法は実際にはないことに注意してください。すべてのアプリのモデルを反復処理する運をテストしたい場合は、loading.pyのソースコードを参照してください。)

Django 1.7以降のアップデート: Djangoの非推奨タイムラインによるとdjango.db.models.loading、Django 1.7で非推奨になり、Django1.9で削除される予定です。Alasdairの回答で指摘されているように、Django 1.7以降には、アプリケーションレジストリがあります。このapps.get_modelメソッドを使用して、モデルを動的に取得できます。

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
于 2009-01-04T23:11:28.400 に答える
48

Django 1.7+ には、applications registryがあります。メソッドを使用してapps.get_model、モデルを動的に取得できます。

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
于 2015-02-07T09:19:49.723 に答える
1
from django.authx.models import User
model = User
model.objects.all()
于 2009-01-04T22:34:45.013 に答える
0

モデル = django.authx.models.User

? Django は、「グローバル名 django が定義されていません」というエラーを返します。

Django はエラーを返しません。Pythonはそうします。

まず、モデルをインポートする必要があります。でインポートする必要があります

from django.authx.models import User

次に、定義されていないエラーが発生した場合djangoは、Django が正しくインストールされていません。PYTHONPATHPython lib/site-packages にDjango がインストールされている必要があります。

Django を正しくインストールするには、http://docs.djangoproject.com/en/dev/intro/install/#intro-install を参照してください

于 2009-01-04T23:42:46.310 に答える
0

クラスは、Python の「ファースト クラス」オブジェクトです。つまり、他のすべてのオブジェクトと同様に、クラスを渡したり操作したりできます。

モデルはクラスです。クラス ステートメントを使用して新しいモデルを作成するという事実からわかります。

class Person(models.Model):
    last_name = models.CharField(max_length=64)

class AnthropomorphicBear(models.Model):
    last_name = models.CharField(max_length=64)

との両方のPerson識別子AnthropomorphicBearは Django クラスにバインドされているため、それらを渡すことができます。これは、モデル レベルで機能する (そして共通のインターフェイスを共有する) ヘルパー関数を作成する場合に役立ちます。

def print_obj_by_last_name(model, last_name):
    model_name = model.__name__
    matches = model.objects.filter(last_name=last_name).all()
    print('{0}: {1!r}'.format(model_name, matches))

そのため、またはモデルprint_obj_by_last_nameのいずれかで動作します。次のようにモデルを渡すだけです。PersonAnthropomorphicBear

print_obj_by_last_name(model=Person, last_name='Dole')
print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy')
于 2009-01-04T23:43:50.613 に答える
-3

モデル名を文字列として渡した場合、1つの方法は次のようになると思います

modelname = "User"
model = globals()[modelname]

しかし、globals() をいじるのは、状況によっては少し危険かもしれません。だから慎重に扱ってください:)

于 2009-01-04T22:40:44.157 に答える