在编写django查询时,可以同时使用id/pk作为查询参数。
Object.objects.get(id=1) Object.objects.get(pk=1)
根据django的文档,我知道pk代表主键,只是一个快捷方式,但是不清楚什么时候应该使用id或pk。
vbopmzt11#
这没关系。pk与实际的主键字段更加独立,即您不需要关心主键字段是称为id还是object_id或其他名称。如果您的模型具有不同的主键字段,它还可以提供更好的一致性。
pk
id
object_id
wnavrhmk2#
在Django项目中,我知道pk总是返回id,我更喜欢在不与id()函数冲突的情况下使用id(除了变量名)。原因是pk是一个比id慢7倍的属性,因为它需要花时间在meta中查找pk属性名。
id()
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。三分之一微秒对web来说不算什么。
user_id
2条答案
按热度按时间vbopmzt11#
这没关系。
pk
与实际的主键字段更加独立,即您不需要关心主键字段是称为id
还是object_id
或其他名称。如果您的模型具有不同的主键字段,它还可以提供更好的一致性。
wnavrhmk2#
在Django项目中,我知道
pk
总是返回id
,我更喜欢在不与id()
函数冲突的情况下使用id
(除了变量名)。原因是pk
是一个比id
慢7倍的属性,因为它需要花时间在meta
中查找pk
属性名。下面是相关的Django代码:
当我需要使用一个名为
pk
的变量时,这确实是一种罕见的情况,我更喜欢使用一些更详细的东西,比如user_id
而不是pk
。在整个项目中最好遵循相同的约定。在您的情况下,
id
是一个参数名,而不是属性,因此在时间上几乎没有区别。参数名不会与内置id()
函数的名称冲突,因此在这里使用id
是安全的。总而言之,你可以选择使用字段名
id
还是pk
的快捷方式。如果你不是在为Django开发库,而是为所有模型使用自动主键字段,那么在任何地方使用id
都是安全的,有时候会更快。另一方面,如果你想通用地访问(可能是自定义的)主键字段,然后到处使用pk
。三分之一微秒对web来说不算什么。