如何按多对多个相关对象值订购查询集?

时间:2014-03-26 02:45:05

标签: python django

我有一个包含Book个对象的查询集。

BookAuthor的关系为m2m。

我想按第一作者的名字订购查询集中的书籍(作者将按字母顺序排序,因此第一个将是姓氏在字母表中排在第一位的那个。)

我想这会是关于聚合的事情,但我似乎无法找到合适的解决方案。

我试过了

books_qs.annotate(first_author=Min('author__lastname')).order_by('first_author')

但当然它不是正确的类型所以我面对ValueError: could not convert string to float: Folland

我应该怎么做?

编辑:Django 1.4.2 + MySQL

1 个答案:

答案 0 :(得分:0)

当然,您将获得ValueError,因为您将字符串传递给Min,而它需要浮动。

也就是说,如果您的Author模型有age = models.FloatField(),则可以将age作为参数传递给Min,例如:Min('age')但是在您的情况下,您无法传递字符串lastname

我不完全理解你的问题。但是如果你想在你的Django模型中订购任何东西,我想最简单的方法就是用class Meta

来做这件事。
class Author(models.Model):
    lastname = models.CharField(max_length=100)
    # other fields ...

    class Meta:
        ordering = ['lastname']

class Book(models.Model):
    author = models.ManyToManyField(Author)
    book_name = models.CharField(max_length=100)
    # other fields ...

    class Meta:
        ordering = ['book_name']

所有作者将按姓氏的字母顺序排序,所有书籍将按其名称的字母顺序排序。