2012-01-19 9 views
1

manytomanyfieldをカスタマイズする際に問題があります。選択した値/データを並べ替えることはできますか?例:Djangoで並べ替えのManyToManyFieldをカスタマイズする

class Author(models.Model): 
author_name = models.CharField(max_length=100) 

class Book(models.Model): 
title = models.CharField(max_length=100) 
author = models.ManyToManyField(Author) 

著者モデルには、Jk Rowling、Jackie Chan、Bruce Lee、Chuck Norrisの値があります。注文はIDに基づいて行われますか?それらのうちのどれが最初に選択されるかを好みのようにカスタマイズできますか?カスタマイズしても、他の書籍には影響しません。私はHPブックを持っていて、私の著者はBruce Lee、Chuck Norris、Jk Rowling、Jackie Chanです。その後、Djangoの本には著者、Jackie Chan、Bruce Lee、Chuck Norris、Jk Rowlingの注文があります。

すべての書籍は、独自の注文をします。それはグローバルではありません。第1冊から注文を変更すると、第2冊は変更された鉱石の影響を受けません。誰かが私を助けることができることを願っています。ありがとう。

答えて

0

Meta orderingを使用できます。以下の提案equinoxel何をすべきか

Author.objects.all().oreder_by('author_name') 

は、あなたが発注のためのフィールドを追加したいし、それを尊重する方法:

class Book(models.Model): 
    # ... 
    authors_order = models.CharField(max_length=255) 

    def get_ordered_authors(self): 
     authors = self.authors.all() 
     authors_by_id = [dict(author.id, author) for author in authors] 
     for author_id in map(int, self.authors_order.split(",")): 
      yield authors_by_id[author_id] 
特定のクエリのために例えば

class Author(models.Model): 
    author_name = models.CharField(max_length=100) 

    class Meta: 
     ordering = ['author_name'] 

またはクエリセットorder_by

また、注文が変更/設定されたときは常にbook.authorsbook.authors_orderを同期させるロジックを実装する必要があります。

+0

私はアレックスを探している人ではありません。私が望むのは、私は注文をカスタマイズする人になり、これはモデル全体に​​影響を与えません。 – david

+0

次に、中間モデルが必要です。 [これについての文書](https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships) – AdamKG

+0

私はあなたが離れて得ることができると思いますブックモデルに「注文」フィールドを追加し、それに対応するロジックを実装するだけです。これは、「自動」手段(たとえば、author/first_name/alpha)がある場合に機能します。手動で注文する場合は、@ AdamKGが正しいです。 –

関連する問題