2013-05-22 75 views
1

我在Django網站上關注了一些示例,我理解Django希望您將項目的各個部分分解爲「應用程序」的想法。瞭解如何創建django模型

每個'應用'都有自己的模型。因此,如果我想創建一個允許用戶登錄和修改某些數據(添加/編輯/刪除)的應用程序,就像收集書籍和作者集合一樣,我需要爲此創建應用程序。

在這種情況下,我將有一個「應用」 包含models.py,有兩個模型類:BookAuthorBook課程將作爲其領域之一author = models.ForeignKey(Author)

因此,這裏是我的問題:

  1. 如果我在創建該應用新app可以在我的模型包含ForeignKey的領域不駐留在同一app模式?
  2. 正如我所提到的,我想要一個允許用戶登錄的憑證「表」。這怎麼可能完成?是否有必要使用用戶模型啓動一個像「用戶」這樣的新應用程序?
  3. 如何將MySQL自動增量,非唯一索引和觸發器等功能合併到這些模式中,或者必須手動完成還是通過MySQL控制檯/管理器完成?
+1

如果以下答案之一已完全解答您的問題,請繼續並接受它。否則,讓我們知道我們可以做些什麼來澄清。 – Jacinda

+0

我喜歡這兩個答案! – 40Plot

+0

哈哈 - 這意味着系統正在工作。歡迎來到SO! – Jacinda

回答

1

沒有什麼能夠阻止你與其他應用中的模型建立關係。應用程序只是一種在邏輯位置對代碼進行分組的方法。以下是您如何引用位於不同應用中的一個模型的示例。

說這是在一個名爲myapp的模塊中,您可以在其他應用程序中引用其他模型,其語法類似於以下內容。在此示例中,「auth」應用程序內部存在用戶模型。

class MyModel(models.Model): 
    .... 
    user = models.ForeignKey('auth.User') 

另見:https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey

Django中有已內置入一個偉大的,靈活的用戶系統。當您啓動一個新項目時,默認情況下,它將創建一個用戶表,該表可用於創建,管理和驗證用戶。

這是一些相關的information。(實際上,上面的示例顯示了與內置用戶表的關係。)除非要定製用戶框架的默認行爲,否則不必爲定義用戶啓動新的應用程序。

Django自動增加主鍵字段記錄。它爲此創建必要的數據庫對象。如果需要,它還會執行唯一的字段,並允許一些其他自定義。據我所知,Django不支持數據庫觸發器。我相信觸發事物的「Pythonic」方式可能會在您的代碼中這樣做。具體來說,Django/Python將管理在其他人之後採取的操作。不過,這只是我的想法。

1
  1. 是的。看到這個問題:Foreign key from one app into another in Django
  2. 您可以使用Django的內置身份驗證應用程序和用戶對象。這是「包含電池」功能之一。請參閱herehere
  3. 我不是 有很多MySQL的經驗,但你提到的一些 內置到ORM中。即如果您未指定 不同的主鍵(AutoField reference),自動增量 會自動使用默認ID字段。從Django 1.5開始添加了Non-unique indices。觸發器似乎有點棘手,但this blog post看起來像一個很好的寫作。

另外,Django aggregation topic guide使用作者和書籍模型作爲主要的例子。

+0

正如第1項子彈的附註 - Django所吹噓的特性之一是「可插拔應用程序」。基本上什麼 這意味着我應該能夠把你的'書籍'應用程序和 插入到我自己的'庫'應用程序,它應該直接工作 框。如果你有一個應用參考了其他應用,那麼你已經 成功地將'Books'應用耦合到這個其他應用,並且你沒有辦法將它們解耦。這是使用Django製作更大系統時的缺點之一,如果你想稱之爲「業務邏輯層」,那麼就沒有 。 –

+0

@limelights你是完全正確的,但我不認爲這兩個(可插入的應用程序與相互依賴關係)是相互排斥的。在大型公司項目中,可能有一些相互依賴的應用程序從未打算公開發布給公衆,但如果分裂(爲了避免具有數千行models.py文件)而在邏輯上更清楚。應該盡一切努力讓事情可重用,但如果整個項目在邏輯劃分上更容易維護,我認爲這是值得的。通常你可以看到一個應用程序是否適合重複使用,同時編寫和設計。 – Jacinda

+0

一個更好的例子,你想要一個外鍵到另一個應用程序(與作者和書籍),將是一個指向Django auth用戶的外鍵,它被廣泛使用。例如。 'appointment_holder = models.ForeignKey(settings.AUTH_USER_MODEL)' – Jacinda