Django查询-id vs pk


202

编写Django查询时,可以同时使用id / pk作为查询参数。

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

根据django的文档,我知道pk代表主键,它只是一个快捷方式。但是,尚不清楚何时应使用id或pk。


下面是各自docmentation:对于idpk
卢茨Prechelt



Answers:


224

没关系 pk从实际的主键字段更加独立,即你不需要关心的主键字段是否被称为idobject_id或什么的。

如果您的模型具有不同的主键字段,则还可以提供更高的一致性。


34
是的 只需使用pk。总是。
cethegeek 2010年

47
id也是Python中的内置函数,因此我更喜欢使用pk。
Thierry Lam 2010年

5
是的,pk最好。请参阅Python标准库中的内置函数文档id。(在Python 2中相同的。)
Lutz Prechelt

25

在我知道pk总是返回的Django项目中,id我更喜欢id在不与id()函数冲突的地方使用(变量名以外的所有地方)。这样做的原因是,pk该属性比id查找中的pk属性名称要花一些时间,因此它要慢7倍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在各处使用。三分之一微秒的时间对于网络而言毫无意义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.