Djangoデータベースクエリ:IDでオブジェクトを取得する方法?


105

Djangoは主キーとしてidフィールドを自動的に作成します。

次に、このIDでオブジェクトを取得する必要があります。

object = Class.objects.filter() 

このフィルターの書き方は?

回答:


179

オブジェクトを取得したい場合get()は、使用する方が簡単です。

obj = Class.objects.get(pk=this_object_id)

18
FYI pkは、任意のモデルの主キーを参照するための推奨される方法です。このidフィールドは、モデルの作成者が主キーを明示的に指定していない場合にのみ生成されます。著者は場合はやった名前が付いていない主キーフィールドを指定しid、そこではありませんidフィールド。
Craig Trader、

また、参考までidに、オブジェクトのIDを返す組み込み関数内。ほとんどの場合、参照idすることで正しいことを行います(例:Class.objects.get(id=this_object_id)作業)。しかし、それは私が思うに考慮すべきことです。
トム

15

私は同じ問題のためにここに着きましたが、別の理由があります:

Class.objects.get(id=1)

このコードはImportError例外を発生させていました。混乱していたのは、以下のコードが正常に実行され、期待どおりに結果セットが返されたことです。

Class.objects.all()

get()メソッドのトレースバックの末尾:

File "django/db/models/loading.py", line 197, in get_models
    self._populate()
File "django/db/models/loading.py", line 72, in _populate
    self.load_app(app_name, True)
File "django/db/models/loading.py", line 94, in load_app
    app_module = import_module(app_name)
File "django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named myapp

Djangoの内部のコードを読んで、モデル定義を含むアプリへのパスが間違っているloading.pyという結論に達しました。アプリへのパスを修正し、メソッドを正常に実行するだけで済みました。settings.pyClassget()

これがsettings.py正しいパスを持つ私のものです:

INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    # ...
    'mywebproject.myapp',

私はDjangoのORMをスタンドアロンとして使用しているため、すべての混乱が生じたため、名前空間はそれを反映する必要がありました。


2

次のこともできます:

obj = ClassModel.get_by_id(object_id)

これは機能しますが、Django 2でサポートされているかどうかはわかりません。


2

以下を使用できます。

objects_all=Class.objects.filter(filter_condition="")

これは、1つのオブジェクトを取得しても、クエリセットを返します。ちょうど1つのオブジェクトが必要な場合:

obj=Class.objects.get(conditon="")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.