В проектах Django, где я знаю, что pk
всегда возвращает id
Я предпочитаю использовать id
, когда он не конфликтует с функцией id()
(везде, кроме имен переменных). Причина этого заключается в том, что pk
- это свойство, которое в 7 раз медленнее, чем id
, так как для поиска 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
. Треть микросекунды - ничто для сети.