2009-09-20 92 views
0

我有一個關於ManyRelatedManager對象在 中的排序的一般性問題。例如, 我的模型中有兩個類:一個是 ,名爲Book for books,另一個是作者Author。在ManyRelatedManager對象中排序

阿多對許多字段在類Book定義 作者= models.ManyToManyField(作者)

在數據庫中,許多一對多關係 在附加表中描述BOOK_AUTHOR 具有三個列:(ID,book_id,AUTHOR_ID)

現在對於一個預定對象b,二者b.authors.all()和b.authors.iterator() 在book_author.author_id的順序進行排序。 但我想要的是以book_author.id的順序檢索b 的作者,因爲這是 作者的正確順序。

任何解決方案?提前謝謝了!

回答

0

的「作者」一書實例的屬性是經理,所以經理方法ORDER_BY()將在它的工作:

book = Book.objects.get(id=1) 
authors = book.authors.order_by('-last_name') 

(假設你有作者一個「姓氏」字段)

+0

我相信你也可以定義一個作者默認的排序,這應該是有效,當你通過一個管理人員的查詢作者。請參閱http://docs.djangoproject.com/en/dev/ref/models/options/#ordering – dcrosta

+0

請注意,我想要的順序不取決於作者的屬性。實際上,對於相同的作者列表,他們可能根據書的內容而有不同的順序。假設作者A和作者B共同撰寫了兩本書。在一本書中,A是第一本書,而在另一本書中,B是第一個作者。然後,我想要的是對於書1,作者的順序是A和B,而對於書2,作者的順序是B和A. –

1

如果你想不同的作者排序依據的書,我想這裏描述建議使用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') 

您還可以添加Metaordering添加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模型和Metaordering,Django將不添加查詢一個一側或另一側時.order_by,例如下面就沒有ORDER BY SQL補充說:

b = Book.objects.get(pk=1) 
b.authors.all() # Not ordered 
+0

最後一點值得重申:我認爲添加一個「貫穿」模型實現排序會允許我的all()調用神奇地開始排序。唉,很多代碼需要改變。 – benwad