模型中的 django request.GET
django request.GET in models
在 Django 中是否可以使用 request.GET 的模型方法?
例如
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'
)
?
可以,但您必须手动传递 request
:
# inside your views
qs_ = car_object.car_filter(request)
但我认为这样做没有任何意义。
所有与 request
有关的内容都应该进入视图,这是请求-响应流的地方。
纯粹从技术上讲,当然可以 - 只要您可以从视图传递请求对象。您发布的示例代码在语法上是不正确的,但是,这样的事情在技术上是可行的。您只需确保该方法是 class 方法,而不是实例方法一(因为在这种情况下您没有任何实例):
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)
...
但是,不要这样做。这是一个坏主意,因为您正在将请求处理逻辑移至模型。模型应该只关心数据,用户请求处理是视图的工作。
所以,我建议在视图中包含所有逻辑:
def your_view(request):
cars = Car.objects.all().order_by("id")
query = request.GET.get("q")
if query:
cars = cars.filter(owner=query)
...
如果你需要一些复杂的逻辑,很多观点会共享,你可以使用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)
...
实际上你只能在你的视野中处理这些东西
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')
否则,您必须从视图中将请求对象发送到模型函数。
在 Django 中是否可以使用 request.GET 的模型方法? 例如
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'
)
?
可以,但您必须手动传递 request
:
# inside your views
qs_ = car_object.car_filter(request)
但我认为这样做没有任何意义。
所有与 request
有关的内容都应该进入视图,这是请求-响应流的地方。
纯粹从技术上讲,当然可以 - 只要您可以从视图传递请求对象。您发布的示例代码在语法上是不正确的,但是,这样的事情在技术上是可行的。您只需确保该方法是 class 方法,而不是实例方法一(因为在这种情况下您没有任何实例):
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)
...
但是,不要这样做。这是一个坏主意,因为您正在将请求处理逻辑移至模型。模型应该只关心数据,用户请求处理是视图的工作。
所以,我建议在视图中包含所有逻辑:
def your_view(request):
cars = Car.objects.all().order_by("id")
query = request.GET.get("q")
if query:
cars = cars.filter(owner=query)
...
如果你需要一些复杂的逻辑,很多观点会共享,你可以使用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)
...
实际上你只能在你的视野中处理这些东西
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')
否则,您必须从视图中将请求对象发送到模型函数。