多对多以及如何从queryset获取查询集

时间:2013-02-17 00:13:18

标签: django django-queryset

我有以下模特:

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

class Store(models.Model):
    name = CharField(max_length=30)
    product = models.ManyToManyField(Product)

如何使用名为Store的产品获取product_name,并获取所有产品(名称为product_name的产品除外)?是否可以在一个查询中进行? 在原始SQL中,它将很简单JOIN。不知道如何通过Django实现它。

3 个答案:

答案 0 :(得分:20)

由于它是懒惰的查询集评估,你实际上可以使用Django做这些事情。 Django的in字段查找接受列表和查询集。以下将创建嵌套的SQL代码:

products = Product.objects.filter(store_set__in=stores_qs)
stores_qs = Store.objects.filter(product__name='product_name')

Here是Django in文档。

答案 1 :(得分:6)

您应该能够根据Product的属性过滤商店,然后prefetch_related检索到的对象。

Store.objects.filter(product__name="product_name").prefetch_related('product')

这应该以最少的时间点击数据库以达到你想要的效果 - 两次。

可以找到进一步的文档here

答案 2 :(得分:1)

使用名为“product_name”的产品获取商店:

Store.objects.filter(product__name='product_name')

获取名称为“product_name”的产品以外的所有产品:

Product.objects.exclude(name='product_name')