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 は番号 = 1 です)。「lvl」はチャプターの深さを表します。たとえば、chap1.1.1 ではレベル 3、chap1.1.1.1 ではレベル 4 です。「order」は、チャプターの順番を示します。たとえば、chap1 では.2 'order' は 2 で、chap2.2 の 'order' も 2 です。

次の章を並べ替えるにはどうすればよいですか (たとえば)?

chapter 2
chapter 2.1
chapter 1.1.1
chapter 1.1
chapter 1

私は考えていました...「1.2.1」のような章番号を保存する StringProperty を作成し、文字列を「。」で分割する必要がありますか? ?


EDIT: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引数は、sort1 つのパラメーターのみを受け入れます。したがって、最大深度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

私の問題を解決するためのより簡単な方法を見つけました。チャプターは別の方法で保存します。でndb.IntegerProperty(repeated=True)。このように私はそれを自分の使用だけで並べ替えることができます:

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

ここで、「バージョン」はndb.IntegerPropertyです。

終わり。

于 2013-02-18T17:14:29.310 に答える
0

最初に頭に浮かんだのは、チャプターを処理するようにルートを設定して、次のようにすることでした。

1/1
1/2/1

于 2013-02-14T07:45:52.683 に答える