В проектах 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
везде. Треть микросекунды - ничто для сети.
id
и дляpk