Джанго запросы - идентификатор против ПК - PullRequest
177 голосов
/ 30 января 2010

При написании запросов django можно использовать оба идентификатора / pk в качестве параметров запроса.

Object.objects.get(id=1)
Object.objects.get(pk=1)

Я знаю, что pk обозначает Primary Key и является просто ярлыком, согласно документации django. Однако неясно, когда следует использовать id или pk.

Ответы [ 2 ]

194 голосов
/ 30 января 2010

Это не имеет значения. pk более независим от фактического поля первичного ключа, т. Е. Вам не нужно заботиться о том, называется ли поле первичного ключа id или object_id или как угодно.

Это также обеспечивает большую согласованность, если у вас есть модели с разными полями первичного ключа.

11 голосов
/ 01 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...