我系统中已经存在4个表。
系统中有很多帐户,每个帐户都有很多项目,每个项目都有很多文档。 [当前系统不在不同的帐户中处理相同的项目名称]
目录表:
class catalog(models.Model):
catalog_name = models.TextField(blank=True, null=True)
documents = models.ManyToManyField(document, blank=True, null=True)
目录表中任何项目的当前系统映射文档。
我们按catalog_name
创建project_name
并在document
中添加文档
所以项目名称不能重复。
项目表:
class Project(models.Model):
FK_Account = models.ForeignKey(Account, blank=True, null=True)
Project_ID = models.TextField(blank=True, null=True, db_index=True)
Project_Name = models.TextField(blank=True, null=True, db_index=True)
文件表:
class document(models.Model):
uid = models.TextField(blank=True, null=True,db_index=True)
获取项目文档的代码:
def getAllProjectDocument(self, project_obj, current_selected_option='All'):
""" Returns All Project Documents. """
docs = []
cat_obj_list = catalog.objects.filter(catalog_name = project_obj.Project_Name + "-user-catalog")
if cat_obj_list:
catobj = cat_obj_list[0]
if current_selected_option=="All":
docs = catobj.documents.filter(status=2)
else:
docs = catobj.documents.filter(status=2, publish_status=int(current_selected_option))
return docs
注意:状态2表示文档在项目中是任意的。
系统中有950000
个文档和300000
个项目。如果我必须获得所有项目的project documents
,那么我必须在catalog
表上查询每个项目,即300000
时间,然后再根据{filtering
进行查询{1}}然后将查询集对象添加到python列表并在完成search
循环后传递给模板
所以for
循环正在for
次运行,然后在300000
上查询相同的计数,即catalog
,并再次过滤相同的计数,即“300000”。所以apache内存增加了。
我提出了以下想法:这是数据库的迁移。
我将创建具有一对一映射og项目和文档的表。 有4种类型的文件 - 1.私人,2。项目,3。图书馆,4。删除文件。
300000
那么** class Project_Document(models.Model):
FK_Project = models.ForeignKey(Project, blank=True, null=True)
FK_Dcoument = models.ForeignKey(document, blank=True, null=True)
映射是正确的还是有人有不同的方法来做到这一点?**
答案 0 :(得分:1)
您的ProjectDocument表实际上只是一个多对多关系,与目录和文档之间的关系完全相同。我不认为添加另一个会有所帮助,特别是因为你必须确保两个关系保持同步。
相反,您应该直接在Catalog和Project之间添加缺少的关系;我不能从代码中告诉我这应该是一对多(ForeignKey)还是一对一,如果前者应该去哪个方向。但假设每个项目都有多个目录,您可以在Catalog上添加一个指向Project的ForeignKey;那么你可以通过一个查询获得项目的所有文档:
project_docs = Document.objects.filter(catalog__project=my_project)
另请注意,您的表格中存在一些效率低下的问题;你似乎整个都在使用TextFields,它们作为blob存储在数据库中,因此会产生巨大的开销。您应该使用CharFields来获取ID和名称等内容; TextFields仅适用于大块文本,例如文档本身的正文内容。