2016-12-08 3 views
2

私はのは、以下のモデル定義と、Bookを言わせて、テーブルを持っている:Djangoのモデルリストオーダーフィールド更新

class Book(models.Model): 
    name = models.CharField('name of the book', max_length=10) 
    sequence = models.IntegerField('The order for the book') 

私は従うようsequenceフィールドでBookリストの順序を表示する必要がある、とシーケンス値だろう

Book.objects.all().order_by('sequence') 

... 1、2、3、などのことしかし、ビューでブックインスタンスを更新/作成するとき、私は立ち往生しています。新しい本モデルを挿入したり、既存の書籍モデルを更新するときに、既存の書籍をre-sequenceする方法がわかりません。

と仮定、私はすでにデータベースに3冊を得た、のは言わせて:

BookA, sequence = 1 
BookB, sequence = 2 
BookC, sequence = 3 

私はシーケンスでBookDという名前の新しいものを、挿入すると、私は既存のものを更新する必要がありますすでにデータベースに登録されている書籍ごとに新しいシーケンス値を割り当てます。私の期待される結果は次のようになります:

BookD, sequence = 1 
BookA, sequence = 2 
BookB, sequence = 3 
BookC, sequence = 4 

だから誰でもdjangoでこれを行う方法を知っていますか?サンプルコードは本当に感謝しています。ありがとうございました。

+0

あなたはhttps://github.com/incuna/djから同じ実装される機能を得ることができますango-orderable。 –

+0

@MikhailPyrevあなたのお薦めに感謝し、注文可能なプロジェクトを見てみましょう... – Enix

答えて

2

あなたはまず、あなたが挿入されているシーケンス番号よりも大きい配列とすべての書籍をフィルタリングし、1でそれらの本のシーケンス番号をインクリメントし、その後、新しいブック保存することができます:

books = Book.objects.filter(sequence__gte=bookD.sequence) 
books.update(sequence=F('sequence')+1) 
bookD.save() 

Inを場合は、bookDはすでに、あなたはsequenceを更新する前に、それを除外することができ作成されます。

books = Book.objects.filter(sequence__gte=bookD.sequence).exclude(pk=bookD.pk) 
books.update(sequence=F('sequence')+1) 
+1

スマートな解決策は...今それを試してみる...ありがとう@AKS .. – Enix

関連する問題