代码之家  ›  专栏  ›  技术社区  ›  Art

Django查询-ID与PK

  •  169
  • Art  · 技术社区  · 15 年前

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

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

    据Django的文档显示,我知道pk代表主键,只是一个快捷方式。但是,不清楚何时应该使用ID或PK。

    2 回复  |  直到 6 年前
        1
  •  186
  •   Felix Kling    15 年前

    没关系。 pk 更独立于实际的主键字段,即不必关心是否调用主键字段 id object_id 或者什么。

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

        2
  •  7
  •   utapyngo    6 年前

    在我知道的Django项目中 pk 总是回报 id 我更喜欢使用 身份证件 当它不与 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 .

    整个项目最好遵循相同的惯例。以你为例 身份证件 是一个参数名,而不是一个属性,所以时间几乎没有区别。参数名称与内置的名称不冲突 () 功能,使用安全 身份证件 在这里。

    综上所述,您可以选择是否使用字段名 身份证件 PK 捷径。如果您不为Django开发一个库并使用 automatic primary key fields 对于所有型号,使用安全 身份证件 到处都是,有时更快。另一方面,如果希望通用访问(可能是自定义)主键字段,则使用 PK 到处都是。三分之一微秒对网络来说毫无意义。