2010-03-17 32 views
61

我正在努力讓自己的頭部圍繞着Django的ORM。我想做的事就是我的表中的字段中獲得不同值的列表....下面的一個等價的:從表格字段中選擇不同的值

SELECT DISTINCT myfieldname FROM mytable 

(或者)

SELECT myfieldname FROM mytable GROUP BY myfieldname 

我d至少喜歡在使用原始sql之前使用Django的方式。 例如,對於一個表:

ID,街道,城市

1,主街,赫爾

2,其他街道,赫爾

3,比博路,萊斯特

4,Another Way,Leicester

5,High Street,Londidium

我想獲得:

赫爾,萊斯特,Londidium。

回答

128

說你的模式是「店」

class Shop(models.Model): 
    street = models.CharField(max_length=150) 
    city = models.CharField(max_length=150) 

    # some of your models may have explicit ordering 
    class Meta: 
     ordering = ('city') 

因爲你可能有Metaordering屬性設置,您可以使用distinct()時使用order_by()不帶參數以清除任何順序。參見下order_by()

的文件如果你不希望任何順序被應用到查詢做,甚至沒有默認的排序,調用ORDER_BY()不帶參數。

distinct()在說明中討論了使用distinct()進行排序的問題。

要查詢你的數據庫,你只需要調用:

models.Shop.objects.order_by().values('city').distinct() # returns a dictionary 

models.Shop.objects.order_by().values_list('city').distinct() # returns a list of tuples. 

您還可以添加flat=Truevalues_list有一個平坦的列表。

另請參閱:Get distinct values of Queryset by field

+25

其實這是有效的。然而!我無法使它適用於我的所有模型。 Weidly,它對一些而不是其他人有效。對於那些有Meta定單的人來說,這是行不通的。所以,你必須首先清除查詢集上的順序。 models.Shop.objects.order_by()。values('city')。distinct() – alj 2010-03-18 10:16:46

+1

值得注意的是'values_list'實際上並不返回一個列表。它返回類似於查詢集的東西。我發現總是在values_list調用中使用list()會很有用。 – dheerosaur 2012-11-19 07:14:40

+8

'values_list'返回一個迭代器的ValuesListQuerySet。投到列表可能很方便,但也可以在所有行必須同時進行評估時發揮性能,特別是對於大型數據集。 – 2012-11-27 13:52:43

相關問題