django request.GET in models

时间:2016-05-14 18:03:48

标签: django filter models

在Django中是否可以使用request.GET的模型方法? e.g。

    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'

)

3 个答案:

答案 0 :(得分:6)

从技术上讲,当然,您可以 - 只要您可以从视图中传递请求对象。您发布的示例代码在语法上是不正确的,但是,这样的技术可行。您只需确保该方法是类方法,而不是实例方法(因为在这种情况下您没有任何实例):

asList()

然而,不要这样做。这是一个坏主意,因为您正在将请求处理逻辑移动到模型中。模型应该只关心数据,用户请求处理是视图的工作。

所以,我建议在视图中包含所有逻辑:

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)
    ...

如果你需要一些复杂的逻辑,很多观点会分享,你可以使用model managers

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

答案 1 :(得分:1)

可能,但您必须手动传递request

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

但这样做我没有任何意义。

request有关的所有内容都应该进入视图,这是请求 - 响应流程的地方。

答案 2 :(得分:0)

实际上你只能在你的视图中处理这些东西

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')

否则,您必须从您的视图中将您的请求对象发送到模型函数。