我正在尝试创建一个基于用户身份验证限制结果的视图。由于某种原因,列表切片总是导致AssertionError一旦切片被捕获就无法过滤查询。
class CustomGalleryDetailView(DetailView):
def get_queryset(self):
if not self.request.user.is_authenticated():
return Gallery.objects.on_site().is_public()[:3]
else:
return Gallery.objects.on_site().is_public()
即使我尝试
return Gallery.objects.all()[:3],
没有进一步过滤,我仍然会收到同样的错误。
答案 0 :(得分:3)
您正在使用DetailView
课程。
您可以在Django docs for DetailsView
中看到,在调用get_queryset
方法后,下一个方法是get_object
(在SingleObjectMixin
类中找到)
您可以在https://github.com/django/django/blob/1.7/django/views/generic/detail.py#L21
找到该方法的来源您可以从该代码中看到,查询集已经过滤,很可能是.filter(pk=pk)
如果您想将可能的对象选择限制为仅需要以不同方式接近它的前三行,例如:
class CustomGalleryDetailView(DetailView):
def get_queryset(self):
if not self.request.user.is_authenticated():
qs = Gallery.objects.on_site().is_public()
valid_ids = qs.values_list('pk', flat=True)[:3]
return Gallery.objects.filter(pk__in=valid_ids)
else:
return Gallery.objects.on_site().is_public()