2017-05-05 37 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

相關問題