0

django mptt モデルの「ランク」を取得する簡単なアルゴリズムを作成しようとしています。「ランク」とは、子孫のレベルの数を意味します... MPTTModel.get_level() に似ていますが、葉から根まで数えます。

私のアプローチは次のとおりです。

ビュー.py

 def index(request):
    nodes = Node.objects.all()
    nodesets = []
    for i in nodes:
        figure_rank(i, i)
        if i.count >= 3:
            nodeset = Node_set(node=i, name=i.name)
            nodeset.save()      # This is where the error is caught
            nodesets.append(dataset)
    return render(request, 'associate/index.html', {'nodesets':nodesets})

def figure_rank(over, under):

    if under.get_children()[0]:
        r = under.get_children()[0]
        over.count += 1
        figure_rank(over, r)
    else:
        return over.count

ランク >=3 のノードの場合、Node_set を作成し、すべてのランクが指定されたらノードのセットを返します。

次のエラーが表示されます。

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/associate/

Django Version: 1.6.2
Python Version: 2.7.5
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'associate',
 'images_app',
 'mptt')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\djangoprojects\images\associate\views.py" in index
  9.         figure_rank(i, i)
File "C:\djangoprojects\images\associate\views.py" in figure_rank
  23.         figure_rank(over, r)
File "C:\djangoprojects\images\associate\views.py" in figure_rank
  23.         figure_rank(over, r)
File "C:\djangoprojects\images\associate\views.py" in figure_rank
  20.     if under.get_children()[0]:
File "C:\Python27\lib\site-packages\django\db\models\query.py" in __getitem__
  132.         return list(qs)[0]

Exception Type: IndexError at /associate/
Exception Value: list index out of range

ここで何が間違っていますか?

4

1 に答える 1

1

子供がいないかどうかを適切に確認する必要があります。ではfigure_rankunder.get_children()空のリストが返され、最初の要素にアクセスしようとします。最初にリストが空かどうかを確認します。

def figure_rank(over, under):
    children = under.get_children()
    if chilren: # check if children is nonempty before accessing the first element
        r = children[0]
        over.count += 1
        figure_rank(over, r)
    else:
        return over.count
于 2014-05-12T19:06:48.720 に答える