djangoクエリを記述する場合、クエリパラメータとしてid / pkの両方を使用できます。
Object.objects.get(id=1)
Object.objects.get(pk=1)
djangoのドキュメントによると、pkは主キーを表し、単なるショートカットであることを知っています。ただし、idとpkのどちらを使用すべきかは明確ではありません。
djangoクエリを記述する場合、クエリパラメータとしてid / pkの両方を使用できます。
Object.objects.get(id=1)
Object.objects.get(pk=1)
djangoのドキュメントによると、pkは主キーを表し、単なるショートカットであることを知っています。ただし、idとpkのどちらを使用すべきかは明確ではありません。
回答:
それは問題ではありません。pkあなたは主キーフィールドが呼び出されたかどうかを気にする必要はありません。すなわち、実際の主キーフィールドから複数の独立であるidか、object_idまたは何でも。
また、異なる主キーフィールドを持つモデルがある場合、より一貫性を提供します。
idPythonの組み込み関数でもあります。そのため、私はpkを使用することを好みます。
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ここでです。
まとめると、フィールド名idとpkショートカットのどちらを使用するかは、あなた次第です。Djangoのライブラリを開発しておらず、すべてのモデルで自動主キーフィールドを使用しidている場合は、どこでも安全に使用できます。一方、(おそらくカスタムの)主キーフィールドへのユニバーサルアクセスが必要な場合は、pkどこでも使用できます。マイクロ秒の3分の1はWebでは何もありません。
idpk