2017-02-07 65 views
2

我有一個有兩個主類的模型。在Django中排序ForiegnKey對象

首先是書模型,第二個是在頁面模型

的網頁有一個外鍵字段,這讓我訪問他們,但書是我很好奇的是,你將如何實現頁碼這樣當創建一個新的頁面對象時,該編號僅限於當前的頁面長度內?而且,如果它被插入,你將如何將下一頁向下翻一頁?

現在我只是有一個整數字段,我手動輸入頁碼,但如果我想讓用戶以後自己添加頁面,那是行不通的。

更新:

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 S,爲了。此外,您可以插入一個新頁面,並且頁碼也會相應更改。所以如果你說有1,2,3頁並且想添加一個新頁面,你可以在頁面4添加一個新頁面,或者在2到3之間插入一個新頁面,而前一頁面3變爲第4頁。

+0

你使用了哪個數據庫?如果postgres,將頁面實現爲json字段會更好。 –

+0

那麼......各種各樣的「deque」?我的第一個「天真」答案是兩個自我'外鍵'和一個聰明的'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

您需要獲得訂單,在列表中插入「Page」的ID,並在向「Textbook」添加「Page」時設置訂單。 –

0

這是我想出了一個很久以前的一個相當簡易的解決方案,但你可能給它一個去。你可以做的是使用CharField

因此,例如,你有一本書具有以下網頁:

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

當你插入一個新的頁面入冊添加另一1頁面數或小數字段的結尾。然後,您可以偶爾運行一項維護任務,將所有數字清理回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到在後臺同時運行一次每。