AssertionError一旦获取切片,就无法过滤查询

时间:2014-12-19 05:19:51

标签: python django

我正在尝试创建一个基于用户身份验证限制结果的视图。由于某种原因,列表切片总是导致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], 

没有进一步过滤,我仍然会收到同样的错误。

1 个答案:

答案 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()