2014-03-26 33 views
3

我有一个包含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的

回答

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'] 

这样所有的作者都会按字母顺序按他们的姓氏排序,所有的书籍将按照字母顺序排序按照他们的名字。

+0

是的,这就是我在我的问题中写的(对于浮动事物)。 我希望书籍按作者姓名排序。说book1有作者'Doe','Simons',book2有作者'Clark',book3有作者'Webster','Albert。我希望命令是[book3,book2,book1],因为有序的作者是['Albert','Clark','Doe']。 – rxdazn

相关问题