2016-01-22 95 views
1

我試圖用django來模擬文件瀏覽器應用程序。我的基本模型是用戶擁有項目的位置,項目中有文件和其他也可以有文件的子目錄。有一個django模型可以屬於兩個其他模型(外鍵關係)

這是我的models.py文件

class CaseFolder(models.Model): 
    name = models.CharField(max_length = 255) 

class SubFolders(models.Model): 
    name = models.CharField(max_length = 255) 
    case = models.ForeignKey(CaseFolder) 

class Documents(models.Model): 
    file = models.FileField(upload_to=set_upload_path) 
    belongs_to = models.ForeignKey(SubFolders) 

截至目前,我創建一個「主」文件夾,這基本上是有其他子目錄的根文件夾。主文件夾也可以包含不屬於子目錄的文件。

如果我可以通過使文檔模型引用根文件夾來消除對「主」文件夾的需要(如果他們不想屬於子目錄),那將會更好。只有這樣我才能看到這是下面。但想知道是否有更好的方法

class Documents(models.Model): 
    file = models.FileField(upload_to=set_upload_path) 
    belongs_to = models.ForeignKey(SubFolders,Null = True) 
    belongs_to_root = models.BooleanField(deafult=False) 

回答

1

忘掉SubFolders模型。

您可以模擬theese結構與在CaseFolder模型,結賬自引用關係:

class CaseFolder(models.Model): 
    name = models.CharField() 
    parent = models.ForeignKey('self', blank=True, related_name='subfolders') 

class Document(models.Model): 
    file = models.FileField(upload_to=set_upload_path) 
    belongs_to = models.ForeignKey(CaseFolder) 

要知道,如果一個Document屬於根,只需使用document.belongs_to.parent is None

+0

要添加此OP可能也想看看使用MPTT – whoisearth

+1

這個作品..謝謝.. @whoisearth - 你會推薦使用MPTT在上述代碼的任何原因嗎? – Kannaj

+0

@Kunkka - 我提供了一個替代解決方案作爲答案和簡短的解釋。 – whoisearth

1

提供替代方案。您可以使用django-mptt

pip install django-mptt

在您的settings.py添加mpttREQUIRED_APPS

這是什麼讓你做的是在你的模型如下:

from mptt.models import MPTTModel, TreeForeignKey 

class CaseFolder(MPTTModel): 
    name = models.CharField() 
    parent = models.TreeForeignKey('self', blank=True, related_name='subfolder', db_index=True) 

class MPTTMeta: 
    order_insertion_by = ['name'] 

這確實在數據庫方面有什麼指標,讓父母和孩子之間的引用表。 This will (in theory) make your queries to the database easier and speed up your application as it grows. It also simplifies how the data is queried.

相關問題