0

我有模型章节:

class Chapter(ndb.Model):
    tutKey = ndb.KeyProperty(kind='Tutorial')
    title = ndb.StringProperty(required=True)
    content = ndb.TextProperty(required=True)
    note = ndb.TextProperty()
    lvl = ndb.IntegerProperty(default=0)
    order = ndb.IntegerProperty(default=0)
    parentID = ndb.KeyProperty(kind='Chapter')
    number = ndb.IntegerProperty()

'number' 是基本章节(chap1 或 chap 1.2 有 number = 1)。'lvl' 表示章节的深度,例如,在 chap1.1.1 中,lvl 为 3,在 chap1.1.1.1 中,lvl 为 4。'order' 表示章节的顺序,例如,在 chap1 .2 'order' 是 2,在 chap2.2 中,'order' 也是 2。

我如何对以下章节进行排序(例如)?

chapter 2
chapter 2.1
chapter 1.1.1
chapter 1.1
chapter 1

我一直在想...我是否应该创建一个 StringProperty 来保存像“1.2.1”这样的章节编号,然后将字符串拆分为“。” ?


编辑:我创建了一个与 JBernardo 建议的 ListProperty 等效的 ndb.IntegerProperty(repeated=True)。我能够正确存储数据,但我无法按属性排序。任何人都知道如何做到这一点?

4

3 回答 3

3

您可以通过具有子章节最大深度长度的元组来表示您的章节。未使用的子章节用零表示。然后以下将是您的章节的代表:

chapter 2      (2, 0, 0)
chapter 2.1    (2, 1, 0)
chapter 1.1.1  (1, 1, 1)
chapter 1.1    (1, 1, 0)
chapter 1      (1, 0, 0)

如果将这些章节添加到列表中,则可以通过列表的方法l对该列表进行排序。sort

chapters = [(2, 0, 0), (2, 1, 0), (1, 1, 1), (1, 1, 0), (1, 0, 0)]
chapters.sort()
print chapters

这给出了:

[(1, 0, 0), (1, 1, 0), (1, 1, 1), (2, 0, 0), (2, 1, 0)]

- - 编辑 - -

在动态比较的情况下,您可以通过选项将函数添加到sort方法中。key此函数在排序之前应用于列表的每个元素。下面expandChapter将一章ch深入展开depth。中的key参数sort只接受一个参数。因此,计算最大深度maxdepth并通过匿名函数expandChapters给出。sortlambda

def expandChapter(ch, depth):
    ch = ch + (0,) * (depth - len(ch))
    return ch

print expandChapter((1,), 3)                                # prints (1, 0, 0)

chapters = [(2,), (2, 1,), (1, 1, 1,), (1, 1), (1,)]
maxdepth = max([len(i) for i in chapters])
print maxdepth                                              # prints 3

chapters.sort(key = lambda x: expandChapter(x, maxdepth))
print chapters

这给出了正确的答案:

[(1,), (1, 1), (1, 1, 1), (2,), (2, 1)]
于 2013-02-13T20:52:39.643 回答
0

我想到的第一件事是设置你的路线来处理章节,这样就有了:

1/1
1/2/1

ETC

于 2013-02-14T07:45:52.683 回答
0

找到了一种更简单的方法来解决我的问题。我以不同的方式存储章节。在ndb.IntegerProperty(repeated=True). 这样我就可以对它进行排序了:

newChaps = sorted(chaps, key=lambda obj: obj.version)

其中“版本”是 ndb.IntegerProperty。

完毕。

于 2013-02-18T17:14:29.310 回答