我正在尝试使用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)
截至目前,我正在创建一个“MAIN”文件夹,它基本上是具有其他子目录的根文件夹。 Main文件夹也可以包含不属于子目录的文件。
如果我可以通过让Documents模型引用Root文件夹(如果他们不想属于子目录)来消除对'main'文件夹的需求,那将是更好的选择。我唯一能看到的就是下面这个。但是想知道是否有更好的方式
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)
答案 0 :(得分:1)
忘记SubFolders
模型。
您可以在CaseFolder
模型中使用自引用关系模拟theese结构,结帐:
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
。
答案 1 :(得分:1)
提供替代方案。您可以使用django-mptt。
pip install django-mptt
在您的settings.py中将mptt
添加到REQUIRED_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.