自定义管理器 django ... return super().get_queryset().filter(author=user)

问题描述 投票:0回答:1

我怎样才能做这样的事情

  • 模型.py
class FilterManager(models.Manager):
    def get_queryset(self) -> QuerySet:
        user = self.request.user
        return super().get_queryset().filter(author=user)


FILTER1 = FilterManager()
  • views.py
class EventViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.EventSerializer
    queryset = Event.FILTER1.all()

https://docs.djangoproject.com/en/5.0/topics/db/managers/

文档和互联网表明,只能在此处的“过滤器”中输入表单的静态值:

 return super(PublishedManager, self).get_queryset().filter(active=True)

get_queryset(self):
    return super().get_queryset().filter(city= 'kolkata')

这是在 models.py 中做正确的事情还是在views.py 中做更好?

我现在有很多重复的代码:

    def get_queryset(self):
        user = self.request.user
        try:
            queryset = Event.objects.filter(author=user)
            return queryset
        except:
            raise Http404  
python django-models django-views django-queryset django-managers
1个回答
0
投票

这是在 models.py 中做正确的事情还是在views.py 中做更好?

。 Django 的模型层应该是“请求不知道”。事实上,这个想法是模型专注于创建、获取和聚合数据。以有用的方式执行此操作并将数据呈现给用户是视图层的任务。 A

Manager

没有请求,因此

self.request
在使用管理器时会失败,除非您以某种方式注入它,但这没有多大意义。

我现在有很多重复的代码。

您可以为此创建一个 mixin。确实:

class MyAuthorViewMixin: author_field = 'author' def get_queryset(self): return ( super() .get_queryset() .filter(**{self.author_field: self.request.user}) )

然后将其混合到其他视图中:

from django.contrib.auth.mixins import LoginRequiredMixin class MyListView(LoginRequiredMixin, MyAuthorViewMixin, ListView): model = Event

所以你编写逻辑来过滤一次,然后将其混合到其他视图中。


注意

:您可以使用以下命令将视图限制为基于类的视图: LoginRequiredMixin

 mixin 
[Django-doc].

© www.soinside.com 2019 - 2024. All rights reserved.