Python 如何将子集上的SQL查询转换为Django

Python 如何将子集上的SQL查询转换为Django,python,mysql,django,subset,Python,Mysql,Django,Subset,我有一个MySQL表,其结构如下: customer product 1 10 1 20 1 30 2 10 2 30 3 10 3 20 3 40 4 10 4 40 4 50 4 60 我想返回与产品的特定列表的子集相关联的所有客户s。例如,如果我的查询

我有一个MySQL表,其结构如下:

customer product
    1       10
    1       20
    1       30
    2       10
    2       30
    3       10
    3       20
    3       40
    4       10
    4       40
    4       50
    4       60
我想返回与
产品的特定列表的子集相关联的所有
客户
s。例如,如果我的查询
产品
ID是
(10,20 30)
,我希望客户
1
2
,因为他们的产品是我列表的一个子集,而不是
3
,因为
40
不在我的列表中,即使
10
20
在我的列表中

我的查询
product
id的长度通常为3-20个条目,但可能有成百上千种不同的产品

我可以在原始SQL中执行此操作:

SELECT * FROM customer c
WHERE NOT EXISTS (
    SELECT 1 FROM cp_table j AND c.id=j.customer_id
            AND j.product_id NOT IN (10,20,30)
);
但是有没有一种简单的方法可以在Django中构造这样一个查询?我使用的是MySQL,所以(显然)我不能在特定列上使用
distinct

我的Django
models.py
文件基本上是:

class Customer(models.Model):
    name = models.CharField(max_length=250)
    products = models.ManyToManyField(Product, through='ProductList')

class Product(models.Model):
    name = models.CharField(max_length=200)

class ProductList(models.Model):
    customer = models.ForeignKey(Customer)
    product = models.ForeignKey(Product)
编辑:好的,多亏了下面的一些评论和答案,我找到了一种方法:

subset_list = [10,20,30]
products_subset = Product.objects.filter(id__in=subset_list)
complement = Product.objects.exclude(id__in=subset_list)

c = Customer.objects.filter(products__in=products_subset)\
                    .exlude(products__in=complement).distinct()

但是,我对这种方法有疑问:它会进行三次查询(或者不进行查询,具体取决于查询集的计算方式),并且
补码
查询集可能相当大。有更好的方法吗?

请显示models.py文件。@Vingtoft我添加了要点:这是一个多对多关系。请显示models.py文件。@Vingtoft我添加了要点:这是一个多对多关系。