2017-10-04 81 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)