我正在尝试创建一个基于用户身份验证限制结果的 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/