我怎样才能做这样的事情
class FilterManager(models.Manager):
def get_queryset(self) -> QuerySet:
user = self.request.user
return super().get_queryset().filter(author=user)
FILTER1 = FilterManager()
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
这是在 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].