2011-10-07 64 views
0

我有一張看起來像這樣的表。簡化我的Django查詢邏輯

+----+--------+---------+-----------+------------------------+ 
| id | parent | type | libTypeId | name     | 
+----+--------+---------+-----------+------------------------+ 
| 2 |  1 | project |   2 | 1p6m4x0y1z_1.2-1.8_hvt | 
| 5 |  1 | project |   6 | 1p6m4x0y1z_1.2-1.8_hvt | 
| 8 |  1 | project |  16 | 1p6m4x0y1z_1.2-1.8_hvt | 
| 11 |  1 | project |  21 | 1p6m4x0y1z_1.2-1.8_hvt | 
| 3 |  1 | project |   2 | 1p6m4x0y1z_1.2-1.8_lvt | 
| 6 |  1 | project |   6 | 1p6m4x0y1z_1.2-1.8_lvt | 
| 9 |  1 | project |  16 | 1p6m4x0y1z_1.2-1.8_lvt | 
| 12 |  1 | project |  21 | 1p6m4x0y1z_1.2-1.8_lvt | 
| 1 |  1 | project |   2 | 1p6m4x0y1z_1.2-1.8_svt | 
| 4 |  1 | project |   6 | 1p6m4x0y1z_1.2-1.8_svt | 
| 7 |  1 | project |  16 | 1p6m4x0y1z_1.2-1.8_svt | 
| 10 |  1 | project |  21 | 1p6m4x0y1z_1.2-1.8_svt | 
| 13 |  2 | project |   2 | 065nm_GPIO    | 
| 17 |  2 | project |   4 | 065nm_GPIO    | 
| 14 |  2 | project |   6 | 065nm_GPIO    | 
| 18 |  2 | project |  12 | 065nm_GPIO    | 
| 15 |  2 | project |  16 | 065nm_GPIO    | 
| 16 |  2 | project |  21 | 065nm_GPIO    | 
| 19 |  2 | project |   2 | 065nm_Specialized  | 
+----+--------+---------+-----------+------------------------+ 

我所尋找的是一個查詢導致我們得到的所有項目,這是由名稱,libtypeid只有第一libtypeid分類ID = 1的列表。

。換句話說,我應該結束了這一點:

+----+--------+---------+-----------+------------------------+ 
| id | parent | type | libTypeId | name     | 
+----+--------+---------+-----------+------------------------+ 
| 2 |  1 | project |   2 | 1p6m4x0y1z_1.2-1.8_hvt | 
| 3 |  1 | project |   2 | 1p6m4x0y1z_1.2-1.8_lvt | 
| 1 |  1 | project |   2 | 1p6m4x0y1z_1.2-1.8_svt | 
+----+--------+---------+-----------+------------------------+ 

現在我可以遠遠得到這個,但我怎麼只得到了第一個?

Variant.objects.filter(parent=self.id).order_by('name', 'libtype_id') 

我再進一步做..

full = Variant.objects.filter(parent=self.id).order_by('name', 'libtype_id') 
names, out = [], [] 
for v in full: 
    if v.name not in names: 
     out.append(v) 
     names.append(v.name) 
return out 

感激,如果有人可以清理它有點..

+0

目前尚不清楚你正在努力完成什麼。你想從結果集中獲得第一個項目?只是使用索引。 – akonsu

+0

akonsu - 是的,我想要在這個集合中的第一個獨特的'名稱' - 我應該最終有三個項目。你能給我一個例子 - 謝謝 – rh0dium

+0

(Variant.objects.filter(parent = self.id).order_by('name','libtype_id')[0])。name是你在問什麼?我仍然不明白... – akonsu

回答

0

這是我一直在尋找答案..

class VariantQuerySet(QuerySet): 
    def as_single_library_type(self): 
     query = self.filter().query 
     query.group_by = ['name'] 
     return QuerySet(self.model, using=self._db, query=query) 

class VariantManager(models.Manager): 

    def get_query_set(self): 
     return VariantQuerySet(self.model, using=self._db) 

這基本上做了默認GROUP BY從而降低了一切,我需要什麼。感謝所有想要回答的人!

0

您可以添加[number]到查詢集,如:

Variant.objects.filter(parent=self.id).order_by('name', 'libtype_id')[0] 

返回查詢集中的第一條記錄。爲了得到最後一個,這將是[:0],冒號反轉拼接。

+0

不是這是該集合的第一個元素。我想要這個集合的所有第一個子元素。 – rh0dium

1

如果我正確地理解了這個問題,您需要「按組」分組並返回每組的第一行。你需要看一看聚集:https://docs.djangoproject.com/en/dev/topics/db/aggregation/

東西沿着

 
Variant.objects 
    .values('name', 'libtype_id') 
    .annotate(min_libtype_id=Min('libtype_id')) 
    .filter(parent=self.id) 
線這是未經測試