Django中的空查询集

时间:2013-04-28 05:17:53

标签: django

我在Django中有一个ListView,其get_queryset()方法有时需要不返回任何结果。我尝试了三种方法:

  1. return EmptyQuerySet()
  2. return Model.objects.none()
  3. return Model.objects.filter(pk=-1)
  4. 其中每一个都会返回一个稍微不同的对象。

    1. django.db.models.query.EmptyQuerySet,其模型属性设置为None
    2. django.db.models.query.EmptyQuerySet,其模型属性设置为Model
    3. django.db.models.query.QuerySet,其模型属性设置为Model
    4. 只有第三个选项适用于基于类的ListView。当ListView尝试访问模型属性时,其他选项会在属性错误时崩溃。这让我感到惊讶并且是一种痛苦,因为它需要我在可能导致MRO问题的地方导入Model。

      我做错了什么/我应该做些什么?

      更新:问题是,通过类视图方法get_queryset()返回空查询集的正确方法是什么?

      更新:以下是Django通用视图中的一行,在尝试访问model属性时遇到属性错误:https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py#L166

2 个答案:

答案 0 :(得分:10)

我认为实现此目的的最佳方法是在objects上为您的相应型号调用none(),然后返回结果。假设您的模型名为Entry

queryset = Entry.objects.none()

答案 1 :(得分:0)

我认为返回空queryset的正确方法是不返回任何内容!像这样:

class FilesView(ModelViewSet):
    serializer_class = myModelSerializer

    def get_queryset(self):
        if some_condition:
            return some_queryset
        # And leave here as it is! don't return anything. Or just write 'else: pass'