2012-06-01 47 views
38

Ben farklı yabancı anahtarların bir listesini elde etmeye çalışmak ve bu yazdım alın:Django Modeli - farklı değer listesi

my_ids = Entity.objects.values('foreign_key').distinct() 

Ama UNDISTINCT yabancı anahtarların sadece bir listesini almak ... ben eksik?

Teşekkürler!

cevap

28

Bu ipucu için! Her iki çözüm de alışkanlık% 100 işe ... ama ben tür MySQL-veritabanları için ayrı doesnt iş için bir argüman (afaik)

Bu seferki çalışır ve döner sadece bir nesne geçirilmesi onları :)

kombine:

Entity.objects.order_by('foreign_key').values('foreign_key').distinct()

Ama yine de teşekkürler :)

+4

Bir Postgres9.1 veritabanında aynı sorunu yaşıyorum, Django == 1.5.5. Order_by eklenmesi yardımcı oldu - aptal ... – kev

31

Belki de bu ile gitmek isteyebilirsiniz:

Entity.objects.order_by().values_list('foreign_key', flat=True).distinct() 
+7

YANLIŞ. Order_by ('foregin_key') olmadan kullanıldığında çalışmaz. Örneğin M2M'de (postgres, django 1.8) – andi

3
Entity.objects.order_by('foreign_key').distinct('foreign_key') 

Zaten bir liste halinde varsa, o ayrı değerleri almak için set() dönüştürün.

+0

, bu dönüştürmenin set() ile olduğu gibi hafızasına göre pahalı bir fikir değildir.() Herşey hafızada doldurulur. Liste şey queryset de değerlendirecek? –

15
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by() 

tarafından sipariş ile çalışmaz ayrı

order_by() çağrısında kullanılan tüm alanlar SQL SELECT sütunlarında bulunur. Bu, bazen ile birlikte kullanıldığında beklenmedik sonuçlara yol açabilir(). İlgili bir modelinden alanlara göre sipariş verirseniz, bu alanlar seçilen sütunlara eklenir ve olabilir, aksi takdirde yinelenen satırlar farklı görünür. Ekstra sütunları döndürülen sonuçlarında görünmüyor (onlar destek sıralamaya sadece vardır) bu yana olmayan farklı sonuçlar iade ediliyor gibi, bazen görünüyor.

Benzer şekilde, bir değerleri kullanmak if() sorgu , herhangi order_by kullanılan sütunlar() (veya varsayılan modeli sipariş) hala yer alacak seçilen sütunları kısıtlamak ve sonuçların tekliği etkileyebilir.

burada ahlaki sizi farklı kullanıyorsanız() İlgili modeller tarafından sipariş konusunda dikkatli olmasıdır. Benzer şekilde, ayrı() ve değerlerini() birlikte kullanırken, değerleri() çağrısında olmayan alanlara göre sıralarken dikkatli olun.

https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

+0

Biraz daha detaylandırır mısınız? Bu sorunun oy verme oranı dikkate alındığında, bu birçok insan için bir sorundur.Bunu söylemek için kaynağın nedir? –

+0

Neredeyse aklımı kaybettim. Bu çözüm için teşekkürler! – Crystal