14

我有以下型号:

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

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

如何获得Store带有产品名称的 sproduct_name以及获得所有产品(带有名称的产品除外product_name)?是否可以在一个查询中完成?在原始 SQL 中,它将是 simple JOINs。不知道如何通过 Django 实现它。

4

3 回答 3

22

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

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

是 Djangoin文档。

于 2013-02-17T01:59:15.493 回答
7

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

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

这应该以最少的时间访问数据库以实现您正在寻找的东西 - 两次。

进一步的文档可以在这里找到。

于 2013-02-17T01:33:28.450 回答
1

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

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

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

Product.objects.exclude(name='product_name')
于 2013-02-17T02:04:02.927 回答