在具有ManyToMany关系的Django模型中,按作者对书目进行排序的问题,同时保留正确的作者顺序



我是Django的新手,所以如果答案显而易见,请原谅这个问题。我已经挣扎了好几天,终于找到了解决办法,但我确信必须有更好的方法。简而言之,问题是:我正在构建一个Django网站,列出各种主题的书籍。主列表应该按作者的字母顺序排列,这一部分很容易。称之为"垂直排序"。然而,相当多的书有多个作者,并且给定书的作者顺序是而不是字母顺序:它可以是任何东西,例如,作者B和作者a,而不是作者a和作者B。称之为"水平排序">

问题是Django表单的默认SelectMultiple小部件允许您选择多个项目,但不允许您指定顺序。它总是按字母顺序出现。我找到了一种方法来强制我想要的排序,但这产生了破坏垂直排序的不良效果。

以下是我的出版物模型的一个片段:

class Publication(models.Model):
"""A class to define publication fields"""
author = models.ManyToManyField(Author, related_name='publications')
title = models.CharField(max_length=200)
[snip...]

其中Author模型(未显示(按lastName、firstName 的字母顺序排序

在视图.py中,我正在这样做:

def dbBib(request):
"""Show all Publications"""
pubs = Publication.objects.all().order_by('author')
[snip...]

当发送到模板时,这种组合会生成一个按作者(垂直(排序的图书目录列表,但其中一些图书作者的排列顺序错误。

我修复水平排序的第一次尝试是在模型中添加一个新字段;author_sorting;所以如果我输入";2,3,1〃;,例如,它将导致指定的作者B、作者C、作者A的作者排序,而不是默认的A、B、C。这很有效,但破坏了垂直排序,因为视图仍然像作者A在列表中第一个一样排序。

我对这个问题的解决方案是在模型中添加另一个字段,";第一作者;其中,我指定了第一作者,并将其用作views.py中的排序字段。但现在,除了在SelectMultiple控件前面提到的author_sorting字段中输入完整作者列表外,我还必须在输入数据时添加另一个属性。这是有效的,但必须有一个更简单的方法!!

一路上,我不得不想出另一个杂烩来删除重复的列表(或者当有三个作者时是三个列表,等等(,但这是另一天的话题。。。

Iain提供的提示让我走上了正轨。我没有使用django orderable解决方案,因为我不确定如何实现它的管理部分,但我确实在https://github.com/alsoicode/django-admin-sortable.这个回购中的文档非常全面,即使是像我这样的新手也能毫不费力地实现解决方案。他们提供了一个完整的工作示例项目,我只需添加几个模型类就可以适应我的问题,这真的很有帮助。特别有用的是关于如何在ManyToMany关系中使用这个的明确示例。再次感谢!

相关内容

  • 没有找到相关文章

最新更新