如果你想不同的作者排序依據的書,我想這裏描述建議使用ManyToMany
場並指定through
屬性: http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships
如果through
模型定義了一個排序列,您可以直接查詢through
模型,例如
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField('Author', through='BookAuthor')
class Author(models.Model):
name = models.CharField(max_length=100)
class BookAuthor(models.Model):
book = models.ForeignKey(Book)
author = models.ForeignKey(Author)
ordering = models.IntegerField()
現在,您可以查詢through
模型直接,如果你想:
b = Book.objects.get(pk=1)
BookAuthor.objects.filter(book=b).order_by('ordering')
您還可以添加Meta
ordering
添加order_by
只要查詢這個模型......
class BookAuthor(models.Model):
# ...
ordering = models.IntegerField()
class Meta:
ordering = ('ordering',)
現在你可以刪除額外的.order_by
子句,因爲Django會自己添加它。
b = Book.objects.get(pk=1)
BookAuthor.objects.filter(book=b)
注意:即使有一個through
模型和Meta
ordering
,Django將不添加查詢一個一側或另一側時.order_by
,例如下面就沒有ORDER BY
SQL補充說:
b = Book.objects.get(pk=1)
b.authors.all() # Not ordered
我相信你也可以定義一個作者默認的排序,這應該是有效,當你通過一個管理人員的查詢作者。請參閱http://docs.djangoproject.com/en/dev/ref/models/options/#ordering – dcrosta
請注意,我想要的順序不取決於作者的屬性。實際上,對於相同的作者列表,他們可能根據書的內容而有不同的順序。假設作者A和作者B共同撰寫了兩本書。在一本書中,A是第一本書,而在另一本書中,B是第一個作者。然後,我想要的是對於書1,作者的順序是A和B,而對於書2,作者的順序是B和A. –