Django request.GET在模型中 [英] django request.GET in models

查看:193
本文介绍了Django request.GET在模型中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Django有可能使用request.GET来建立模型吗?
例如

$ $ p $ $ $ $ $ $ $ $ $ b car_model = ...
def car_filter(self,request):
query = request.GET.get(q)
如果查询:
Car.objects.filter (owner = self.id.order_by('id')
else:
Car.objects.filter(owner = me).order_by('id'


解决方案

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

  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():
返回cls.objects.all()

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

但是,不要做这个。这是一个坏主意,因为您正在将您的请求处理逻辑转移到模型。模型应该只关心数据,用户请求处理是视图的工作。所以,我建议拥有所有视图中的逻辑:


$ b $

  def your_view(request):
cars = Car.objects.all()。order_by(id)
如果查询:
cars = cars.filter(owner = query)
...

如果您需要一些复杂的逻辑,那么很多视图会共享,您可以使用模型管理器

  class CarManager(model.Manager):
def own(self,username = None):
queryset = super(CarManager,self).get_query_set()
如果用户名:
user = Owner.objects.get(username = username)
queryset = queryset.filter(owner = user)
返回queryset
$ b $ class Car(models.Model):
...
objects = CarMan ager()

...
def your_view(request):
query = request.GET.get(q)
cars = Car.objects。 (查询)
...


Is it possible in Django to have models method with 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'

)

?

解决方案

Purely technically speaking, sure, you can - as long as you can pass the request object from the view. The example code you've posted is syntactically incorrect, but, something like this is technically possible. You just have to make sure that the method is class-method, not instance-method one (since you don't have any instances in this case):

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

However, DON'T DO THIS. It's a bad idea because you're moving your request processing logic to a model. Models should only care about the data, and user request handling is view's job.

So, I'd suggest to have all the logic in the views:

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

If you need some complicated logic, that a lot of views would share, you can use 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)
    ...

这篇关于Django request.GET在模型中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆