2013-04-28 94 views
2

我在Django中有一個ListView,它的get_queryset()方法有時需要返回沒有結果。我已經試過三種方式來做到這一點:Django中的空查詢集

  1. return EmptyQuerySet()
  2. return Model.objects.none()
  3. return Model.objects.filter(pk=-1)

這些收益中的每一個稍有不同的對象。

  1. django.db.models.query.EmptyQuerySet設置爲None
  2. django.db.models.query.EmptyQuerySet其模型的模型屬性屬性設置爲Model
  3. django.db.models.query.QuerySet其模型屬性設置爲Model

只有第三個選項與類基於ListView。當ListView嘗試訪問模型屬性時,其他選項會在屬性錯誤上崩潰。這令我感到驚訝,並且很痛苦,因爲它需要我在可能導致MRO問題的地方導入模型。

我在做什麼錯誤/我應該做什麼不同?

更新:那麼問題是,什麼是正確的方式來通過類視圖方法返回一個空的查詢集get_queryset()

更新:這裏是Django的通用視圖試圖訪問時model屬性命中屬性錯誤的行:https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py#L166

+0

爲什麼你不能使用第二個選項,'EmptyQuerySet'在這種情況下,一個模型屬性。 – 2013-04-28 05:35:01

+0

只要考慮一下,如果你需要在列表視圖中有一個空的查詢集,那麼我認爲你已經得到了錯誤的邏輯設置。你應該能夠處理,而不會崩潰或如此。 – 2013-04-28 06:08:55

+0

@akshar:你會想,但Django仍然在這一行中引發一個Attribute錯誤:https://github.com/django/django/blob/stable/1.5.x/django/views/generic/list.py#L166 – Erik 2013-04-28 15:31:58

回答

2

我認爲最好的方法是讓objectsnone()爲你的模型,並返回結果。假設你的模型被命名爲Entry

queryset = Entry.objects.none()