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)
...
nettes Teil über Modellmanager :) – madzohan
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
@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