У проектах 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)
Ось відповідний код Джанго:
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