2016-05-02 6 views
1

Ich möchte einen zusätzlichen Manager zum Abrufen einer gefilterten Version einer umgekehrten ManyToMany-Beziehung erstellen. Ich habe diese Modelle:Kann ich in Django einen zusätzlichen benutzerdefinierten Manager für eine umgekehrte ManyToMany-Beziehung erstellen?

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

    albums = models.ManyToManyField('Album') 

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

Ich kann mit album.photo_set.all() alle Fotos in einem Album bekommen. Ich würde gerne eine Möglichkeit bieten, nur die öffentlichen Fotos in einem Album zu erhalten, indem Sie album.photo_set.public() tun (was würde, irgendwo, tun Sie eine .filter(is_public=True)).

Ich denke, ich möchte eine zusätzliche Related manager bieten, aber ich bin mir nicht sicher, ob das möglich ist. Ich möchte oder möchte den standardbezogenen Manager nicht ersetzen (was sich sowieso nach einer schlechten Idee anhört). Ich brauche kein Custom-Through-Modell für die Beziehung, es sei denn, das ist der einzige Weg, dies zu erreichen.

Antwort

2

Sicher, Sie könnten einen verwandten Manager machen, aber das scheint ein bisschen übertrieben dafür.

Warum nicht einfach eine Funktion zu Ihrem Modell hinzufügen, die nur die öffentlichen Fotos im Album zurückgibt?

def get_public(self): 

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

Ich glaube, ich war dieses :) Natürlich Grübeln, die schön einfach zu sein scheint. Wenn jemand anderes keine andere brillante Idee hat, werde ich das später korrigieren, danke. –

0

Sie können Manager wie folgt erstellen:

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) 
Verwandte Themen