在Django中自定义重新排序ManyToManyField

时间:2012-01-19 13:31:51

标签: django

我在定制manytomanyfield时遇到问题,是否可以重新排序所选的值/数据?例如:

class Author(models.Model):
author_name = models.CharField(max_length=100)

class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ManyToManyField(Author)

让我们说作者模型具有Jk罗琳,成龙,李小龙,查克诺里斯的价值观。订购将基于ID吗?如果首先选择哪一个,我可以像我想要的那样自定义它吗?另外,当我自定义它时,它不会影响其他书籍。就像我有HP的书,我的作者订购的将是李小龙,查克诺里斯,Jk罗琳和成龙。然后,Django书将由作者订购,成龙,李小龙,查克诺里斯和Jk罗琳。

每本书都有自己的订购。它不会是全球性的。一旦您更改了第一本书的订购,第二本书将不会受到更改的矿石的影响。我希望有人可以帮助我。感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用Meta ordering。例如

class Author(models.Model):
    author_name = models.CharField(max_length=100)

    class Meta:
         ordering = ['author_name']

或查询集order_by以获取特定查询:

Author.objects.all().oreder_by('author_name')

要执行下面的equinoxel建议,您需要添加一个用于排序的字段,以及一个尊重它的方法:

 class Book(models.Model):
     # ...
     authors_order = models.CharField(max_length=255)

     def get_ordered_authors(self):
         authors = self.authors.all()
         authors_by_id = [dict(author.id, author) for author in authors]
         for author_id in map(int, self.authors_order.split(",")):
             yield authors_by_id[author_id]

每当更改/设置排序时,您还需要实现使book.authorsbook.authors_order保持同步的逻辑。

相关问题