python - AssertionError 无法在获取切片后过滤查询

标签 python django

我正在尝试创建一个基于用户身份验证限制结果的 View 。出于某种原因,列表切片总是导致 AssertionError Cannot filter a query once a slice has been take.

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], 

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

最佳答案

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

关于python - AssertionError 无法在获取切片后过滤查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27560131/

相关文章:

Django 修改网桥表

python - Django 单元测试 : How to test concurrent database operations?

python - `pass` 标记缩进代码块结束的关键字

python - 将 Pandas DataFrame 从宽格式转换为长格式

python - 解析命令行参数的最佳方法是什么?

python - Django - DateTimeField 收到一个天真的日期时间

sql - 如何在Django中更新M2M字段

python - 如何确保调试配置中没有 pdb 调用?

python - SymPy逻辑函数的同步替换

python - SQLAlchemy 为 postgres JSON 列设置默认值