7

私はdjango-MPTTの Ben Firshman のフォークを使用しています (推奨についてはDaniel Rosemanに感謝します)。

共通の親を共有するノードの順序を変更しようとして行き詰まりました。次のような主キーのリストがあります。

ids = [5, 9, 7, 3]

これらすべてのノードには、たとえば主キー 1 を持つ親があります。

現在、これらのノードは順序付けさ[5, 3, 9, 7]れていますが、順序を変更するにはどうすればよい[5, 9, 7, 3]ですか?

私はこのようなことを試しました:

last_m = MyModel.get(pk = ids.pop(0))
last_m.move_to(last_m.parent, position='first-child')

for id in ids:
  m = MyModel.get(pk = id)
  m.move_to(last_m, position='right')

のドキュメントmove_toに従って、私がやりたいことを期待していますが、何も変わらないようです。最初のアイテムがids親の最初の子になるように見える場合もあれば、そうでない場合もあります。

兄弟であるターゲットがターゲットの直後に移動するノードをmove_to呼び出すためのドキュメントを読んでいるのは正しいですか?move_tonposition=rightnn

これを理解しようとしてモデル テーブルを台無しにしてしまった可能性があるため、上記のコードは実際には正しいのかもしれません。これを行うためのはるかに洗練された方法 (おそらくO(n)選択とO(n)更新を含まない方法) がある可能性もあります。

私は何かを誤解しましたか?

おまけの質問: django-MPTT に、特定のモデルのすべてのインスタンスの再構築lftと値を強制する方法はありますか?rght

4

1 に答える 1

6

これは、以前に言及した MPTT の失敗のアーティファクトだと思います。ノードを移動すると、移動しているノードのインスタンスは正しく更新されますが、ターゲットのインスタンスは更新されません (ただし、データベースで更新されます)。

この結果、コードではそれぞれmが - の右側に移動されますlast_mが、値last_mは移動前の位置を反映しているため、次の移動では移動後の新しい値ではなく元の lft/right 値が使用されます。 .

last_m解決策は、毎回リロードすることです。

for id in ids:
  last_m = MyModel.objects.get(pk=last_m.id)
  m = MyModel.get(pk = id)
  m.move_to(last_m, position='right')
于 2010-02-24T14:22:20.887 に答える