2016-05-02 2 views
1

逆のManyToMany関係のフィルターされたバージョンを取得するための追加のマネージャーを作成したいと思います。私はこれらのモデルを持っています:Djangoでは、逆のManyToMany関係のカスタムカスタムマネージャを作成できますか?

class Photo(models.Model): 
    # ... 
    is_public = models.BooleanField() 

    albums = models.ManyToManyField('Album') 

class Album(models.Model): 
    # ... 

album.photo_set.all()とアルバム内のすべての写真を取得できます。 album.photo_set.public()(これは、どこかで、.filter(is_public=True)となります)を実行して、の公開の写真をアルバム内でのみ取得する方法を提供したいと思います。

私は余分なRelated managerを提供したいと思いますが、それが可能であるかどうかはわかりません。私は、デフォルトの関連マネージャーを置き換えることを望まない、または必要としない(これはとにかく悪い考えのように思える)。私はそれを達成する唯一の方法でない限り、関係のためのモデルを通してカスタムを必要としません。

答えて

2

確かに、あなたは関連するマネージャーを作ることができますが、これはちょっと不合理なようです。

アルバム内の公開写真のみを返す関数をモデルに追加するだけではどうですか?

def get_public(self): 

    return self.photo_set.filter(is_public = True) 
+1

私はきれいに簡単なようだ。もちろん、この:)を、overthinkingたと思います。誰か他の素晴らしいアイデアが出てこない限り、私はこれを後で正しくマークします。ありがとうございます。 –

0

あなたはこのようにマネージャーを作成することができます。

class PublicManager(models.Manager): 
    use_for_related_fields = True 

    def public(self, *args, **kwargs): 
     kwargs.update({ 
      'is_public': True 
     }) 
     return self.get_queryset().filter(*args, **kwargs) 
関連する問題