【问题标题】:AssertionError Cannot filter a query once a slice has been takenAssertionError 获取切片后无法过滤查询
【发布时间】:2014-12-19 05:19:51
【问题描述】:

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

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

【问题讨论】:

  • 查询集从您的get_queryset 方法返回后被过滤...
  • 您的意思是可能在第 3 方应用的模板中吗?
  • 我不是读心者,所以我不知道过滤发生在哪里,但很明显,您遇到的错误肯定是这种情况
  • 我有点不知所措。如果您对去哪里有任何建议,我将不胜感激。
  • 您需要提供更多详细信息以供其他人帮助...请发布您的视图类的完整代码

标签: python django


【解决方案1】:

您正在使用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()

【讨论】:

  • 这解决了错误,但它不限制任何结果。我想那是另一回事。
  • 不限制任何结果是什么意思?如果用户未登录,则查询集仅限于前三个项目
  • user.is_authenticated() 始终返回 true。当我登录或注销时,它显示相同的结果。编辑:我认为这与缓存有关。不过你的回答肯定没有错
  • 这确实是另一个问题...你可以依靠 Django 的user.is_authenticated() 说实话,所以你需要调查为什么你有一个经过身份验证的用户,而你却没想到
猜你喜欢
  • 2021-03-05
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2012-09-11
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多