【问题标题】:Manually listing objects in Django (problem with field ordering)在 Django 中手动列出对象(字段排序问题)
【发布时间】:2010-05-01 12:03:45
【问题描述】:

我在找出最好的/Djangoic 方式来做这件事时遇到了一些麻烦。我正在创建类似于交互式教科书的东西。它有模块,或多或少类似于章节。每个模块页面都需要列出该模块中的主题,并按部分分组。

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

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

我想我可以纯粹为了排序而为每个模型添加一个字段,但这样做的问题是一个主题可能出现在不同的模块中,并且在它们所在的任何部分中,它们都必须再次排序不知何故。

如果不是因为我需要将主题作为模板(或视图)中的对象,我可能会放弃并手动完成所有操作,以便我可以根据用户标记它的方式对其进行标记。

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

edit:我能想到的最简单的事情是,如果我可以在模块或部分模型中拥有一个有序列表(主题),但这是不可能的。是吗?也许有一个自定义字段?

【问题讨论】:

  • 有没有办法根据表中的现有数据来排序?还是排序真的取决于部分? (提供一些精简模型会有所帮助!)
  • 表中没有其他数据可用于执行此操作。想一想:如果您正在为一本书创建目录,则不一定有任何方法可以按内容对章节进行排序——您只需手动排序即可。我会提供主题模型,但它实际上只是一个字符域(它的名称),并且从它们的末端通过外键与之相关的页面。 Module 和 Section 不在模型中,因为我只需要它们来解决我要问的问题。

标签: django django-models django-templates


【解决方案1】:

所以你的结构基本上是模块/部分/主题,主题可以出现在多个部分中。

基本上,你想要这个(省略内容字段):

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")

【讨论】:

    【解决方案2】:

    我会在您的数据库中使用一个表专门用于对模块中的主题进行排序,例如:

    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")。

    【讨论】:

    • 我喜欢这个解决方案,但我真的可以像这样使用 order_by 吗?我不需要在查询中的某处引用我用于此排序的新表吗?
    • 您需要通过外键将订单表链接到模块和主题表。然后,您执行以下操作:Mod=module.objects.get(module="mod1") order.objects.filter(module=mod).order_by("order")。然后,您可以通过每个订单对象中的外键访问主题。
    • 这也是最好的解决方案,有关如何在 django 中正确执行此操作的更多信息,请参阅docs.djangoproject.com/en/dev/topics/db/models/…
    • 这就是我所使用的,在此表中有一个额外的部分列,允许我在模板中重新组合。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2016-04-12
    • 2014-08-14
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多