Djangoクエリ-IDとpk


203

djangoクエリを記述する場合、クエリパラメータとしてid / pkの両方を使用できます。

Object.objects.get(id=1)
Object.objects.get(pk=1)

djangoのドキュメントによると、pkは主キーを表し、単なるショートカットであることを知っています。ただし、idとpkのどちらを使用すべきかは明確ではありません。


ここにそれぞれのidpk
ドキュメントが


何かがそれがよりにあるかどうかを知りたいdocs.djangoproject.com/en/1.11/topics/db/queries/...
ラジャンChauhan

回答:


224

それは問題ではありません。pkあなたは主キーフィールドが呼び出されたかどうかを気にする必要はありません。すなわち、実際の主キーフィールドから複数の独立であるidか、object_idまたは何でも。

また、異なる主キーフィールドを持つモデルがある場合、より一貫性を提供します。


34
うん。単にpkを使用してください。常に。
cethegeek 2010年

47
idPythonの組み込み関数でもあります。そのため、私はpkを使用することを好みます。
Thierry Lam、

5
はい、pk望ましいです。Python標準ライブラリの組み込み関数のドキュメントをidご覧ください。(これはPython 2でも同じです。)
Lutz Prechelt

26

pk常に返されることがわかっているDjangoプロジェクトでは、関数と競合しない場合(変数名を除くすべての場所)をid使用idすることを好みますid()。これはpk、プロパティでの属性名のid検索に時間がかかるため、プロパティが7倍遅いためです。pkmeta

%timeit obj.id
46 ns ± 0.187 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit obj.pk
347 ns ± 11.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

関連するDjangoコードは次のとおりです。

def _get_pk_val(self, meta=None):
    meta = meta or self._meta
    return getattr(self, meta.pk.attname)

def _set_pk_val(self, value):
    return setattr(self, self._meta.pk.attname, value)

pk = property(_get_pk_val, _set_pk_val)

という名前の変数を使用する必要がある場合、これは本当にまれなケースpkです。のuser_id代わりに、より冗長なものを使用することを好みpkます。

プロジェクト全体で同じ規則に従うことが望ましいです。あなたのケースでidは、プロパティではなくパラメータ名なので、タイミングにほとんど違いはありません。パラメータ名は組み込みid()関数の名前と衝突しないので、安全に使用できますidここでです。

まとめると、フィールド名idpkショートカットのどちらを使用するかは、あなた次第です。Djangoのライブラリを開発しておらず、すべてのモデルで自動主キーフィールドを使用しidている場合は、どこでも安全に使用できます。一方、(おそらくカスタムの)主キーフィールドへのユニバーサルアクセスが必要な場合は、pkどこでも使用できます。マイクロ秒の3分の1はWebでは何もありません。

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