有一个django模型,可以属于另外两个模型(外键关系)

时间:2016-01-22 12:13:15

标签: python django database-design

我正在尝试使用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)

2 个答案:

答案 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.