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
または何でも。
また、異なる主キーフィールドを持つモデルがある場合、より一貫性を提供します。
id
Pythonの組み込み関数でもあります。そのため、私はpkを使用することを好みます。
pk
常に返されることがわかっているDjangoプロジェクトでは、関数と競合しない場合(変数名を除くすべての場所)をid
使用id
することを好みますid()
。これはpk
、プロパティでの属性名のid
検索に時間がかかるため、プロパティが7倍遅いためです。pk
meta
%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では何もありません。
id
pk