2017-10-04 155 views
1

,我有以下數據:GROUP BY和過濾器的Django模型

1, Red, Audi 
2, Black, Audi 
3, Black, BMW 

我想有兩個RedBlack(也只有他們)顏色相同的車都行。

在這種情況下,我希望1和2的結果,因爲AudiRedBlack,而不是3,因爲沒有RedBMW

如何用django orm實現它?

class Car(Model): 
    id = UUIDField(primary_key=True, 
        default=uuid.uuid4, 
        editable=False) 
    color = WordField(db_index=True, max_length=75) 
    name = WordField(db_index=True, max_length=75) 
+0

您是如何定義模型的?如果您不向我們顯示您的代碼,我們無法提供幫助。 – ozgur

+0

更新版本。 –

回答

-1

你可以嘗試的方法是這樣的:

from django.db.models import Subquery, OuterRef, Q, Count, IntegerField 


color_filter = Q(color="Red") | Q(color="Black") 
cars = Car.objects.annotate(
    count=Subquery(
     Car.objects.filter(color_filter, name=OuterRef('name')) 
      .values('name') 
      .annotate(count=Count('name')) 
      .values('count'), output_field=IntegerField() 
    ) 
).filter(color_filter, count=2) 
+0

name__in = ...計算查詢集,它可能非常巨大。 –

0

我不知道如何(或者)這樣的語句Django的ORM,但如果你願意做一個原始查詢這應該工作:

SELECT a.* 
FROM (SELECT * FROM Car WHERE color='Black') AS a 
INNER JOIN (SELECT name FROM Car WHERE color='Red') AS b 
ON (a.name=b.name)