Django:渲染章节和章节标题以及相关对象?

时间:2015-03-16 12:41:47

标签: django django-models

我正在设置一个Django数据库来保存由章节,章节和小节组成的书中的有机体的条目。每章都有章节,这些章节may包含子章节。生物可以属于 部分或子部分,并在其中进行排序。

数据仅作为生物和代码列表提供给我。例如,Monkeys & apes的代码字段为01010102,这意味着它位于第1章第1节和第1小节中。Gynandria的代码字段为{{1} },这意味着它在第2章第1节。

除此之外,我还有章节和章节标题的文本列表,例如020100011.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解决方案会很好。

1 个答案:

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