Django=クエリを記述するとき、クエリパラメータとしてid/pkの両方を使用できます。
Object.objects.get(id=1)
Object.objects.get(pk=1)
Djangoのドキュメントによると、pkは主キーの略であり、単なるショートカットであることがわかっています。ただし、idまたはpkをいつ使用するかは明確ではありません。
関係ありません。 pk
は実際の主キーフィールドからより独立しています。つまり、主キーフィールドがid
またはobject_id
などと呼ばれるかどうかを気にする必要はありません。
また、異なる主キーフィールドを持つモデルがある場合、より一貫性が得られます。
In Django私がpk
が常にid
を返すことを知っているプロジェクトでは、id()
関数(変数名を除くすべての場所)と衝突しない場合はid
を使用することを好みます。 pk
は、id
でpk
属性名を検索するのに時間がかかるため、meta
よりも7倍遅いプロパティです。
_%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
という名前の変数を使用する必要があるのは、本当にまれなケースです。 pk
の代わりに_user_id
_のような、より冗長なものを使用することを好みます。
プロジェクト全体で同じ規則に従うことが望ましいです。あなたの場合、id
はプロパティではなくパラメータ名であるため、タイミングにほとんど違いはありません。パラメーター名は、組み込みのid()
関数の名前と衝突しないため、ここでid
を使用しても安全です。
要約すると、フィールド名id
を使用するか、pk
ショートカットを使用するかを選択するのはユーザー次第です。 Django=のライブラリを開発しておらず、すべてのモデルで 自動主キーフィールド を使用している場合は、id
をどこでも安全に使用できます。一方、(おそらくカスタムの)主キーフィールドへのユニバーサルアクセスが必要な場合は、あらゆる場所でpk
を使用します。