我有模型章节:
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'是基础章节(第1章或第1.2章的数字= 1)。 'lvl'是章节的深度,例如,在第1.1.1章中,lvl是3,在第1.1.1.1节中,lvl是4.而'order'表示chap的顺序,例如,在第1章中.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”,然后将字符串拆分为'。' ?
编辑:我创建了一个ndb.IntegerProperty(repeated = True),相当于JBernardo建议的ListProperty。我能够正确存储数据,但我无法通过属性进行排序。谁知道怎么做?
答案 0 :(得分: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
函数将sort
提供给lambda
。
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)]
答案 1 :(得分:0)
我想到的第一件事就是设置你的路线来处理章节,以便有类似的东西:
1/1
1/2/1
等
答案 2 :(得分:0)
找到一种更简单的方法来解决我的问题。
我以不同的方式存储章节。在ndb.IntegerProperty(repeated=True)
。这样我只能使用它来排序:
newChaps = sorted(chaps, key=lambda obj: obj.version)
其中'version'是ndb.IntegerProperty。
完成。