2010-05-01 33 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