2014-01-25 36 views
0

所以this question已被問過,但沒有答案。我知道在一個不同的查詢集中加入一個帶註釋的查詢集並不是在Django中實現的,但問題是:這樣做的替代方法是什麼?Django沒有實現工作左右

代碼示例:

qs1 = Example.objects.filter(...).annotate(...) 
qs2 = Example.objects.filter(...).distinct(...) 
from itertools import chain 
answer = chain(qs1,qs2) 

但這將返回以下錯誤,因爲在Django 「是沒有實現」:

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/models/query.pyc in __iter__(self) 
    94    - Responsible for turning the rows into model objects. 
    95   """ 
---> 96   self._fetch_all() 
    97   return iter(self._result_cache) 
    98 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/models/query.pyc in _fetch_all(self) 
    852  def _fetch_all(self): 
    853   if self._result_cache is None: 
--> 854    self._result_cache = list(self.iterator()) 
    855   if self._prefetch_related_lookups and not self._prefetch_done: 
    856    self._prefetch_related_objects() 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/models/query.pyc in iterator(self) 
    218    klass_info = get_klass_info(model, max_depth=max_depth, 
    219           requested=requested, only_load=only_load) 
--> 220   for row in compiler.results_iter(): 
    221    if fill_cache: 
    222     obj, _ = get_cached_row(row, index_start, db, klass_info, 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/models/sql/compiler.pyc in results_iter(self) 
    708   fields = None 
    709   has_aggregate_select = bool(self.query.aggregate_select) 
--> 710   for rows in self.execute_sql(MULTI): 
    711    for row in rows: 
    712     if has_aggregate_select: 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/models/sql/compiler.pyc in execute_sql(self, result_type) 
    769   """ 
    770   try: 
--> 771    sql, params = self.as_sql() 
    772    if not sql: 
    773     raise EmptyResultSet 

/Library/Python/2.7/site-packages/Django-1.6-py2.7.egg/django/db/models/sql/compiler.pyc in as_sql(self, with_limits, with_col_aliases) 
    119    if distinct_fields: 
    120     raise NotImplementedError(
--> 121      "annotate() + distinct(fields) not implemented.") 
    122    if not ordering: 
    123     ordering = self.connection.ops.force_no_ordering() 

NotImplementedError: annotate() + distinct(fields) not implemented. 

所以,再一次,問題是:是什麼一些方法來完成鏈接這些查詢集?

回答

2

我不得不在這樣的時候做這樣的事情,所以你對iter工具的處理是正確的,你必須將它轉換爲列表。

from itertools import chain 

cars = Cars.objects.all() 
trucks = Truck.objects.all() 
all_vechiles = chain(list(cars), list(trucks)) 

源位置:http://mushfiq.me/2013/08/04/django-merging-to-queryset-using-itertools/

+0

我仍然得到同樣的錯誤......注意,你的榜樣是不是使用不同也不標註,這是什麼原因造成我的錯誤。如果我拿出我的'distict(...)',那麼這個工作不使用'list',但我需要明確的呼叫 –

+0

這很奇怪,可能是因爲Django查詢是懶惰的,你可以嘗試強制查詢評價,然後鏈接他們 – Anup

+0

的工作!如果你編輯你的答案,我會接受它(只需把'list'函數放在'cars'和'trucks'而不是整個鏈上) –