2017-07-06 53 views
1

我在數據庫中的多個類型OBJ_TYPE的我如何可以結合2 Django的查詢到一個與對象限制

什麼,我現在做的是

a = Search_model.objects.filter(obj_type="mall", city=city)[:2] 

b = Search_model.objects.filter(obj_type="store", city=city)[:2] 

然後再結合A和B因此它給了我: -

[{"name":"a","obj_type":"mall"}, {"name":"b","obj_type":"mall"}{"name":"c","obj_type":"store"}, {"name":"d","obj_type":"store"}] 

我想是這樣的

if not search_in == None: 
     search_in_queries = [q for q in re.split(",", search_in) if q] 

     for query in search_in_queries: 
      search_in_dict.append(('obj_type__contains', query)) 

     search_in_query = [Q(x) for x in search_in_dict] 
    else: 
     search_in_query = None 

這樣search_in的值是「商場,專賣店」

a = Search_model.objects.filter(reduce(operator.or_, search_in_query), city=city)[:4] 

,但它給了我所有的商場型的obj

[{"name":"a","obj_type":"mall"}, {"name":"b","obj_type":"mall"}{"name":"c","obj_type":"mall"}, {"name":"d","obj_type":"mall"}] 

所以我的查詢是如何能夠做到上述的結果在一個查詢

+0

您是否有任何獨特的基於約束的數據?我的意思是任何分組數據?你可以使用'annotate'對它們進行分組並獲取兩條第一條記錄。 –

+0

你可以給任何示例語法 –

+0

我想這需要普通的SQL,並且很難做到與DJango ORM。你使用的是哪個sql後端? –

回答

2

您是否嘗試過使用列表用戶__in進行搜索。因此,構建你想要過濾的東西的列表。

Search_model.objects.filter(obj_type__in=["mall", "store"], city=city) 

參見:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#in

+0

請正確地閱讀問題。 「購物中心」和「商店」的前2條記錄 –

+0

按什麼排序? – wrdeman

+1

是@NagarajTantri你是正確的我只是想將2個數據庫調用合併爲一個來實現上述結果 –

0

如果是Postgres的,你可以使用ROW_NUMBER與原始SQL一起:

Search_model.objects.raw("SELECT id, obj_type from (
     SELECT t.*, ROW_NUMBER() OVER (PARTITION BY obj_type) AS rn 
     FROM search_model t 
    ) WHERE rn < 3 and obj_type in ('mall', 'store')" 
); 

會不會喜歡這種方式,因爲我最後一次檢查的sqlite3沒有ROW_NUMBER

對於SqlLite3你可以解僱:

SELECT id, obj_type 
FROM search_model t1 
WHERE id in ( 
    select id from search_model t2 
    where t2.obj_type = t1.obj_type 
    order by t2.obj_type desc limit 2 
) 
ORDER BY id, obj_type DESC; 

使用Django ORM,我們可能look into,在內部,一個QuerySet可以被構造,過濾,切片,一般通過周圍沒有實際進入數據庫:

from django.db.models import Q 

mall_items = Search_model.objects.filter(obj_type="mall", city=city).values_list("id", flat=True)[:2] 
store_items = Search_model.objects.filter(obj_type="store", city=city).values_list("id", flat=True)[:2] 

print Search_model.objects.filter(Q(id__in=mall_items)|Q(id__in=store_items))