我有一个包含Book
个对象的查询集。
Book
与Author
的关系为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 :(得分: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']
所有作者将按姓氏的字母顺序排序,所有书籍将按其名称的字母顺序排序。