Python 如何将子集上的SQL查询转换为Django
我有一个MySQL表,其结构如下: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。例如,如果我的查询
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
我的Djangomodels.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我添加了要点:这是一个多对多关系。