2016-05-14 12 views
0

Ist es in Django möglich, Modelle Methode mit request.GET? z.B.django request.GET in Modellen

class Car(models.Model): 
     owner = ForeignKey(Owner) 
     car_model = ... 
     def car_filter(self, request): 
      query = request.GET.get("q") 
      if query: 
       Car.objects.filter(owner = self.id.order_by('id') 
      else: 
       Car.objects.filter(owner = me).order_by('id' 

) 

?

Antwort

5

Rein technisch gesprochen, sicher, Sie können - solange Sie das Anfrageobjekt aus der Sicht übergeben können. Der Beispielcode, den Sie gepostet haben, ist syntaktisch falsch, aber so etwas ist technisch möglich. Sie müssen nur sicherstellen, dass die Methode ist die Klasse-Methode, nicht instanz Verfahren ein (da Sie alle Instanzen nicht in diesem Fall):

class Car(models.Model): 
    ... 
    @classmethod 
    def get_by_owner(cls, request): 
     query = request.GET.get("q") 
     if query: 
      return cls.objects.filter(owner=query) 
     elif request.user.is_authenticated(): 
      return cls.objects.all() 

def your_view(request): 
    cars = Car.get_by_owner(request) 
    ... 

jedoch dies nicht tun. Es ist eine schlechte Idee, weil Sie Ihre Anforderungsverarbeitungslogik auf ein Modell übertragen. Modelle sollten sich nur um die Daten kümmern, und die Bearbeitung von Benutzeranforderungen ist Aufgabe von View.

Also, würde ich vorschlagen, die gesamte Logik in den Ansichten haben:

def your_view(request): 
    cars = Car.objects.all().order_by("id") 
    query = request.GET.get("q") 
    if query: 
     cars = cars.filter(owner=query) 
    ... 

Wenn Sie einige komplizierte Logik müssen, dass viele Ansichten teilen würden, können Sie model managers:

class CarManager(model.Manager): 
    def owned(self, username=None): 
     queryset = super(CarManager, self).get_query_set() 
     if username: 
      user = Owner.objects.get(username=username) 
      queryset = queryset.filter(owner=user) 
     return queryset 

class Car(models.Model): 
    ... 
    objects = CarManager() 

... 
def your_view(request): 
    query = request.GET.get("q") 
    cars = Car.objects.owned(query) 
    ... 
+1

nettes Teil über Modellmanager :) – madzohan

+1

Sie können 'Car.car_filter (request)' nicht aufrufen, da Modellmethoden in Zeilenebene funktionieren, muss es mit einem Objekt aufgerufen werden. Der Anruf auf Table/Model Ebene erfolgt über Manager – doniyor

+2

@doniyor Sie haben absolut Recht, ich habe eine falsche Antwort gemacht. Es tut uns leid! Dies wurde mit '@ classmethod' behoben. Jetzt sollte es korrekt sein (obwohl ich immer noch nicht vorschlage, die Dinge auf diese Weise zu tun, insbesondere die Übergabe von Anforderungsobjekten - Manager sind eine sauberere Lösung) – drdaeman

1

Möglich, aber Sie haben die request manuell weitergeben müssen:

# inside your views 
qs_ = car_object.car_filter(request) 

aber ich nicht dabei keinen Sinn sehen.

Alles, was mit request zu tun hat, sollte in Ansichten gehen, die der Ort für Anfrage-Antwort-Flow ist.

0

Eigentlich kann man diese Dinge aus Ihrer Sicht behandeln nur

def yourview(self, request): 
    query = request.GET.get("q") 
    if query: 
     Car.objects.filter(owner = self.id).order_by('id') 
    else: 
     Car.objects.filter(owner = me).order_by('id') 

sonst andere Sie weise Sie müssen Ihr Anfrageobjekt aus Ihrer Sicht an die Modellfunktion senden.

+0

Was passiert, wenn ich eine Ansicht habe, die Kontextdaten z. 'Autos' zu meiner Vorlage und in der Vorlage, die ich für ... Schleife: für jedes Auto in Autos Anzeige eachcar.related_object Und jetzt möchte ich alle verwandten Objekt globally durch z. DATUM, das ich von einer anderen Ansicht an die Ansicht weitergebe, die die oben erwähnten Kontextdaten verarbeitet?Im Moment ist die einzige Möglichkeit, diese related_objects zu filtern, das DATE zu meinen Modellen an die related_objects CLASS zu senden, da ich keine Möglichkeit sehe, diese related_objects in der oben genannten Ansicht mit Kontextdaten zu filtern, da ich dort nicht direkt auf related_objects referenziere – BlueDog

Verwandte Themen