我正在设置一个Django数据库来保存由章节,章节和小节组成的书中的有机体的条目。每章都有章节,这些章节may
包含子章节。生物可以属于 部分或子部分,并在其中进行排序。
数据仅作为生物和代码列表提供给我。例如,Monkeys & apes
的代码字段为01010102
,这意味着它位于第1章第1节和第1小节中。Gynandria
的代码字段为{{1} },这意味着它在第2章第1节。
除此之外,我还有章节和章节标题的文本列表,例如02010001
和1.1: Mammals
。
大约有4,000种生物,还有几百个生物。
我想按顺序呈现包含章节和章节标题的模板,以及下面列出的相关条目,如下所示:
第1章:动物
第1.1节:哺乳动物
第1.1.1小节:灵长类动物
人类,猴子和猩猩......
第1.1.2小节:Bruta
大象,海牛......
第1.2节鸟类
第1.2.1节:秃鹫&秃鹰
安第斯秃鹰,秃鹰...
第2章:植物
第2.1节Monandria
Gynandria,...
我的问题是:什么是明确有效的方法呢?我希望保持相当轻量级,同时使模型易于理解。但是这个页面会被大量使用,所以我也希望它能够相当高效。
我已经开始设置模型如下:
1.1.1: Primates
我打算像这样设置我的观点:
def Section(models.Model):
chapter = models.IntegerField()
section = models.IntegerField()
subsection = models.IntegerField(null=True, blank=True)
title = models.CharField(max_length=200)
def Organism(models.Model):
name = models.TextField()
code = models.IntegerField()
section = models.ForeignKey(Section)
模板如下:
def all_sections(request):
sections = Section.objects.all().order_by('-chapter', '-section', '-subsection')
organisms = Organism.objects.all().order_by('code')
context = {
'sections': sections,
'organisms': organisms
}
return render(request, 'all_sections.html', context)
我很欣赏有关最清晰,最有效的方法的建议。目前我认为我可以在JavaScript中分割客户端的有机体,但是拥有非JS解决方案会很好。
答案 0 :(得分:0)
我会为章节和子部分制作模型,并在视图中构建结构,因此服务器端。该视图将从所有模型中获取所有模型,没有select_related
,您将不得不自己完成此操作。 (我删除了各种类型,并尝试/排除了铸件,你可以自己添加它们。)
from collections import OrderedDict
def all_sections(request):
chapters = dict((c.id, c) for c in Chapter.objects.all().iterator())
sections = dict((s.id, s) for s in Section.objects.all().iterator())
subsections = dict((s.id, s) for s Subsection.objects.all().iterator())
structure = OrderedDict()
for organism in Organism.objects.all().iterator():
chapter_id = int(organisme[:2])
section_id = int(organisme[2:4])
subsection_id = int(organisme[4:6])
if chapter_id not in structure:
structure[chapter_id] = {
"chapter": chapters[chapter_id],
"sections": OrderedDict()}
tmp_sections = structure[chapter_id]["sections"]
if section_id not in tmp_sections:
tmp_sections[section_id] = {
"section": sections[section_id],
"subsections": OrderedDict(),
"organisms": []}
if not subsection_id: # check if is zero
tmp_section[section_id]["organisms"].append(organism)
continue
else:
tmp_subsections = tmp_sections["subsections"]
if subsection_id not in tmp_subsections:
tmp_subsections[subsection_id] = {
"subsection": subsections[subsection_id],
"organisms": []}
tmp_subsections[subsection_id]["organisms"].append(organism)
return render(request, 'all_sections.html', structure)
不会写出模板,从这里开始认为这很简单。
PS。如果您想保留当前的Section模型,可以按如下方式进行预取:
chapters, sections, subsections = dict(), dict(), dict()
for section in Section.objects.all().iterator():
if section.chapter:
chapters[section.chapter] = section
elif section.section:
sections[section.section] = section
else:
subsections[section.subsection] = section