2016-05-17 18 views
0


Ich habe ein Modell, das ein Besitzerfeld hat.
django - dynamische manager

class MyModel(models.Model): 
    owner = models.CharField(...) 

I erweiterte die django User Klasse und fügte hinzu, ein Eigentum

eingereicht
class AppUser(User): 
    ownership = models.CharField(...) 

ich einen Manager für MyModel erstellen will, so wird es nur Objekte abzurufen, die in Benutzern mit dem Eigentum der aktuell angemeldeten entsprechen .
Zum Beispiel (mit Rahmen Django REST):

class MyModelAPI(APIView): 
    def get(self, request, format=None): 
     # This query will automatically add a filter of owner=request.user.ownership 
     objs = MyModel.objects.all() 
     # rest of code ... 

aller Beispiele für konstante Werte Benutzermanager in ihren Anfragen und ich bin für etwas dynamischere suchen. Ist das Ding überhaupt möglich?
Danke

+0

Was ist die Beziehung von 'MyModel' und' AppUser'? Sollte "Eigentümer" nicht ein "ForeignKey" sein? – schwobaseggl

+0

nein ... es ist eher eine Berechtigungssache als eine Fremdschlüsselsache. Einige Benutzer haben eine spezielle Eigentümerschaft, die es ihnen ermöglicht, alle Objekte von MyModel –

+0

abzurufen. Also im Grunde genommen alle 'MyModel' -Instanzen, in denen' owner == request.user.ownership'? – schwobaseggl

Antwort

0

Dies ist mit einem benutzerdefinierten Manager nicht möglich, da ein Modellmanager zum Laden der Klasse instanziiert wird. Daher ist es in Bezug auf den http-Anfrage-Antwort-Zyklus zustandslos und könnte nur einige benutzerdefinierte Methoden bereitstellen, an die Sie den Benutzer ohnehin übergeben müssten. Also, warum Sie nicht nur einige bequeme Methode/Eigenschaft auf Ihrem Modell hinzufügen (ein Manager ausschließlich für diesen Zweck überflüssig scheint)

class MyModel(models.Model): 
    ... 
    @clsmethod 
    def user_objects(cls, user): 
     return cls.objects.filter(owner=user.ownership) 

Dann Ihrer Ansicht nach:

objs = MyModel.user_objects(request.user) 

Für eine Manager- basierte Lösung, siehe this question. Eine andere interessante Lösung ist eine benutzerdefinierte Middleware, die den aktuellen Benutzer über ein Funktions-/Modulattribut verfügbar macht, auf das in der Methode get_queryset() des Benutzers get_queryset() zugegriffen werden kann, wie beschrieben here.

+0

Danke. Das Problem bei diesem Ansatz ist, dass ich Django REST-Framework verwende. Wenn ich also eine ListAPIView habe, kann ich nicht wirklich das richtige queryset 'queryset = MyModel.objects.owned_by ()' setzen –