Dans les projets Django où je sais que pk
retourne toujours id
Je préfère utiliser id
lorsqu'il n'entre pas en conflit avec le id()
(partout sauf pour les noms de variables). La raison en est que pk
est une propriété qui est 7 fois plus lente que id
puisque cela prend du temps de chercher pk
nom de l'attribut dans 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)
Voici le code Django correspondant :
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)
C'est vraiment un cas rare où j'ai besoin d'utiliser une variable nommée pk
. Je préfère utiliser quelque chose de plus explicite, comme user_id
au lieu de pk
.
Il est préférable de suivre la même convention pour l'ensemble du projet. Dans votre cas id
est un nom de paramètre, pas une propriété, il n'y a donc pratiquement aucune différence dans les délais. Les noms des paramètres n'entrent pas en conflit avec le nom des propriétés intégrées. id()
il est donc possible d'utiliser la fonction id
ici.
En résumé, c'est à vous de choisir d'utiliser ou non le nom de champ id
ou le pk
raccourci. Si vous ne développez pas de bibliothèque pour Django et que vous utilisez la fonction champs de clé primaire automatique pour tous les modèles, il est sûr d'utiliser id
partout, ce qui est parfois plus rapide. D'un autre côté, si vous voulez un accès universel aux champs de clé primaire (probablement personnalisés), utilisez alors pk
partout. Un tiers de microseconde n'est rien pour le web.
0 votes
Voici cette docmentation respective : pour
id
y pourpk
0 votes
Duplicata possible de Quelle est la différence entre Model.id et Model.pk dans django ?
0 votes
Vous voulez savoir s'il y a quelque chose de plus docs.djangoproject.com/fr/1.11/topics/db/queries/
0 votes
Vérifiez la version mise à jour ici docs.djangoproject.com/fr/2.2/topics/db/models/