2016-01-22 72 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.

相关问题