django request.GET in models

Blu*_*Dog 0 django filter 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'

)
Run Code Online (Sandbox Code Playgroud)

?

drd*_*man 7

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

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)
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果您需要一些复杂的逻辑,许多视图将共享,您可以使用模型管理器:

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)
    ...
Run Code Online (Sandbox Code Playgroud)

  • @doniyor你是对的,我做错了答案.抱歉! 用`@ classmethod`修正了这个问题.现在它应该是正确的(虽然我仍然不建议以这种方式做事,尤其是传递请求对象 - 管理器是更清洁的解决方案) (2认同)