2017-02-07 2 views
2

私は2つの主要なクラスを持つモデルを持っています。DjangoのForiegnKeyオブジェクトの並べ替え

最初は本モデルであり、第二は、ページモデルである

ページは私がそれらにアクセスすることができますブックに外部キーフィールドを持っていますが、私は好奇心だことはどのようにページ番号を実装し、あります新しいページオブジェクトを作成するときに、その数は現在のページの長さ内にのみ制限されますか?さらに、それが挿入されている場合、次のページを1つ下にシフトしますか?

今、私は手動でページ番号に入力する整数フィールドを持っていますが、ユーザーが後でページを自分自身で追加できるようにしたい場合、それはできません。

更新:だから、上記の

class Textbook(models.Model): 
    founder = models.CharField(max_length=256) 
    title = models.CharField(max_length=256) 
    cover = models.ImageField(upload_to=get_image_path, 
           blank=True, 
           null=True) 

    def __str__(self): 
     return self.title 


class Page(models.Model): 
    textbook = models.ForeignKey(Textbook, related_name="pages") 
    page_title = models.CharField(max_length = 256) 

    def __str__(self): 
     return self.page_title 


class Section(models.Model): 
    page = models.ForeignKey(Page,related_name="sections") 
    section_title = models.CharField(max_length=256) 
    text = RichTextField(config_name='awesome_ckeditor') 

    def __str__(self): 
     return self.section_title 

は私が何をしようとしています何を、私のモデルでは、あなたが順番に、TextBookの中に含まれているページ、を追跡できるようにしますです。さらに、新しいページを挿入するとページ番号がそれに応じて変更されます。したがって、ページ1,2,3があり、新しいページを追加したい場合は、ページ4として新しいページを追加するか、または2と3の間に挿入してページ3になります。

+0

どのデータベースを使用していますか? postgresの場合は、ページをjsonフィールドとして実装する方がよいでしょう。 –

+0

だから... 'deque'の種類?私の最初の "素朴な"答えは2つのself-'ForeignKey'と巧妙な 'save()'関数ですが、* thud *は "もっと良い方法が必要です"。 JSONベースのソリューションを使用する方法もありますが、何をするかによって問題になる可能性があります。 –

+0

@RaphaëlGomèsそれは私が考えたことです。しかし、私はより良い方法が必要であることに同意します。 sqlite(私が今使っているもの)からJSONに変換するのは簡単ですか? – Peter

答えて

1

「order_with_respect」オプションあなたの質問に答えはありません:

https://docs.djangoproject.com/en/1.10/ref/models/options/#order-with-respect-to

+0

これは良い方法です。しかし、PostgreSQLのPeterに切り替える必要があります。 ^^ –

+0

私はおそらくこれを行うつもりですが、いつ新しいページを挿入するときに 'set_RELATED_order'を呼び出すのですか? – Peter

+0

'Textbook'に' Page'を追加するときに、注文を取得し、リストに 'Page'のIDを挿入し、注文を元に戻す必要があります。 –

0

これは私が長い時間前に思い付いた、むしろ即興ソリューションですが、あなたはそれをやってみるかもしれません。あなたができることはCharFieldを使用することです。あなただけのページ数や10進数フィールドの最後に別の1を追加するブックに新しいページを挿入すると

1 1.1 2 2.1 2.11 2.111 3 4 5 6 7 8.11 

だから例えば、あなたは以下のページで本を持っています。その後、保守作業を実行してすべての数値を1 2 3 4に戻すことができます。これにより、定期的に余分な小数点以下を捨てることができます。

次のpythonコードを見てみることができます:

In [2]: l 
Out[2]: ['1', '2', '3', '4', '4.1', '4.11', '4.11', '5', '6', '1.1'] 

In [3]: sorted(l) 
Out[3]: ['1', '1.1', '2', '3', '4', '4.1', '4.11', '4.11', '5', '6'] 

In [4]: l.append('5.1') 

In [5]: sorted(l) 
Out[5]: ['1', '1.1', '2', '3', '4', '4.1', '4.11', '4.11', '5', '5.1', '6'] 

あなたがバックグラウンドにいる間に一度実行するdjango management commandを使用して、ルーチンタスクを作成することができます。

関連する問題