在编写Django查询时,可以使用id/pk作为查询参数。
Object.objects.get(id=1)
Object.objects.get(pk=1)
我知道pk代表主键(primary key),根据 Django 的文档,它只是一个快捷方式。然而,什么情况下应该使用 id 或 pk 不太清楚。
在编写Django查询时,可以使用id/pk作为查询参数。
Object.objects.get(id=1)
Object.objects.get(pk=1)
我知道pk代表主键(primary key),根据 Django 的文档,它只是一个快捷方式。然而,什么情况下应该使用 id 或 pk 不太清楚。
没关系。 pk
与实际的主键字段更加独立,即您不需要关心主键字段是称为 id
还是 object_id
或其他内容。
如果您有具有不同主键字段的模型,则它还提供更多一致性。
pk
更可取。请参阅Python标准库中内置函数id
的文档(Python 2中也是一样的)。 - Lutz Precheltid
,而不是Python的id
函数。 - Devang Hingupk
总是返回id
时,除变量名以外的其他地方,我更喜欢使用id
,只要它不与id()
函数冲突。之所以这样做,是因为pk
是一个属性,比id
慢7倍,因为它需要在meta
中查找pk
属性名称。%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
。 - Lutz Prechelt