2010-05-01 42 views
1

我有一些困難找出最佳/ Djangoic方式來做到這一點。我正在創造一種類似於交互式教科書的東西。它有模塊,或多或少像章節一樣。每個模塊頁面都需要列出該模塊中的主題,並將其分組。在Django中手動列出對象(問題與現場排序)

我的問題是我如何確保他們在模板中以正確的順序列出?具體爲:

1)如何確保各部分以正確的順序出現?
2)如何確保主題以正確的順序出現在本節中?

我想我可以爲每個模型純粹爲了排序而添加一個字段,但問題在於,一個主題可能出現在不同的模塊中,並且在它們所在的任何部分中,它們都必須是以某種方式訂購。

我可能會放棄並手動完成所有工作,因爲我不需要將模板(或視圖)中的主題作爲對象進行標記,因此我可以根據用戶如何標記它。

所以我想我的問題是關於是否應該手動創建內容頁面,還是以某種我沒有想到的方式排序查詢結果的方式。謝謝你的幫助!

編輯:我能想到的最簡單的事情是如果我可以在模塊或節模型中有一個有序列表(主題),但afaik不可能。是嗎?也許有自定義字段?

+0

有什麼方法可以根據表中的現有數據對這些數據進行排序?或者是排序真的是區段依賴的? (提供一些精簡的模型將有所幫助!) – KillianDS 2010-05-01 12:22:06

+0

表中沒有其他數據可以執行此操作。想一想:如果你正在創建一本書的目錄,你不一定有任何按照內容排序的章節 - 你只需要手動訂購它們。我會提供主題模型,但它實際上只是一個charfield(它的名字),並且Pages從它們最後通過外鍵關聯它。模塊和部分不在模型中,因爲我只是需要它們來解決我所問的這個問題。 – Chris 2010-05-01 12:31:34

回答

4

所以你的結構基本上是模塊/節/主題,主題可以出現在多個部分。

基本上,你想要這個(省略內容字段):

class Module(models.Model): 
    title = CharField(max_length=100) 

class Section(models.Model): 
    topics = ManyToManyField(Topic, related_name="sections", 
     through='TopicEntry') 
    module = models.ForeignKey(Module, related_name="sections") 

class Topic(models.Model): 
    text = models.TextField() 

class TopicEntry(models.Model): 
    section = models.ForeignKey(Section) 
    topic = models.ForeignKey(Topic) 
    order = models.IntegerField() 

ManyToManyField.through更多信息,請參閱Extra Fields on Many-to-Many Relationships。儘管如此,文檔還不完全清楚。如果我正確地閱讀它們以獲取目錄,請使用以下內容:

topicList = Topic.objects.filter(section=section).order_by("TopicEntry__order") 
# Might be "topicEntry__order" or "topicentry__order" instead; the docs aren't 
# clear how it transforms the name of the intermediate model. 
# This also works: 
topicList = section.topics.all().order_by("TopicEntry__order") 
1

我會用一個表在數據庫專門爲模塊如訂購主題:

Topic | Module | Order 
A  | mod1 | 2 
B  | mod1 | 1 
C  | mod1 | 3 
C  | mod2 | 2 
A  | mod2 | 3 
B  | mod2 | 1 

它可能不是最好的方法,但它是如何我已經解決了這個問題在我自己的應用程序。

要訂購數據,您只需在model.objects.filter()語句的末尾使用.order_by(「field_name」)。

+0

我喜歡這個解決方案,但是我真的可以使用order_by嗎?我不需要參考查詢中某個地方使用的新表格嗎? – Chris 2010-05-01 12:34:32

+0

您需要通過外鍵將訂單錶鏈接到模塊和主題表。然後,您執行如下操作:Mod = module.objects.get(module =「mod1」)order.objects.filter(module = mod).order_by(「order」)。然後您可以通過每個訂單對象中的外鍵訪問主題。 – danspants 2010-05-01 12:44:29

+0

這是imho也是最好的解決方案,有關如何在django中正確執行此操作的更多信息,請參閱http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many一對多關係 – KillianDS 2010-05-01 12:46:52