在Django中手动列出对象(字段排序问题)

时间:2010-05-01 12:03:45

标签: django django-models django-templates

我在找出最佳/ Djangoic方法时遇到了一些麻烦。我创造的东西就像一本互动教科书。它有模块,或多或少像章节。每个模块页面都需要列出该模块中的主题,分为几个部分。

我的问题是如何确保它们在模板中以正确的顺序列出?具体做法是:

1)如何确保各部分以正确的顺序出现?
2)如何确保主题在正确的顺序中出现?

我想我可以纯粹为了排序而为每个模型添加一个字段,但问题是主题可能出现在不同的模块中,并且无论它们在哪里,它们都将再次被订购不知何故。

我可能会放弃并手动完成这一切,因为我不需要将Topic作为模板(或视图)中的对象,因此我可以根据用户标记它来标记它。

所以我想我的问题实际上与我是否应该手动创建内容页面有关,或者是否有一种方式以我没想过的方式对查询结果进行排序。谢谢你的帮助!

编辑:我能想到的最简单的事情就是如果我可以在模块或部分模型中有一个有序列表(主题),但是afaik那是不可能的。是吗?也许有自定义领域?

2 个答案:

答案 0 :(得分: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 :(得分: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”)。