2017-05-05 69 views
6
class MyModel(models.Model): 
    id = models.IntegerField(primary_key=True) 

在Django模型中将字段命名为'id'是否安全?

class MyModel(models.Model): 
    id_ = models.IntegerField(primary_key=True) 

根据PEP8 single_trailing_underscore_应该被用来避免与Python关键词的冲突,但有列名为ID_看起来难看,并可能导致混乱的人不熟悉在数据库级蟒蛇。

Django文档使用'id'列名称: https://docs.djangoproject.com/en/1.11/ref/models/fields/#uuidfield

将此字段命名为'id'是否安全?

+0

我不知道不安全,但我敢肯定,django会自动为您提供此字段。 –

回答

5

Python允许遮蔽在任何上下文中内建限定的id字段。 Builtin在LEGB模型中处于最低优先级(局部变量,封闭范围,全局变量,内建值)。与此同时,其他模块中的代码不会受到这种阴影的影响;在其他情况下,id仍将指内置。所以暗影建筑完全安全。 “真正”的问题是这是否是一个好主意。在这种情况下:

  • id()是一个不太常用的内置函数。
  • 因为类变量通常以类或实例的名称后跟一个点作为前缀,所以在类内部隐藏内建与在内部映射内部函数或全局内容不太可能产生混淆。
  • 在Django代码中有.id字段是惯用的,事实上,如果不这样做,Django默认会创建此字段。
+0

Django确实创建了这个字段作为默认和标准,所以使它不是PK的东西,这将是一个明确的,可维护的,其他开发友好的事情? – Jmons

+0

@Jmons:这取决于。如果项目中的每个*模型都遵循该模式,则应符合现有样式。但是如果你从头开始写一些新东西,我建议让'id'字段成为你的主键。 – Kevin

5

是的,如果您为Django模型添加自定义主键,则可以使用id,就像您在文档中链接的示例一样。然而,对于常规使用,Django的自动创建作为

id = models.AutoField(primary_key=True) 

Read more here

相关问题