【问题标题】:Many to many and how to get a queryset from queryset多对多以及如何从查询集中获取查询集
【发布时间】:2013-02-01 17:21:22
【问题描述】:

我有以下型号:

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

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

如何获取Stores 产品名为product_name 以及获取所有产品(名称为product_name 的产品除外)?是否可以在一个查询中完成? 在原始 SQL 中,它很简单 JOINs。不知道如何通过 Django 实现。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

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

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

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

    更多文档可以在here找到。

    【讨论】:

    • 这不会从 prefetch_related 结果中排除“product_name”产品
    【解决方案2】:

    由于它是惰性查询集评估,您实际上可以使用 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 文档。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-11-14
        • 2012-10-04
        • 2022-11-14
        • 1970-01-01
        • 2021-12-10
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        相关资源
        最近更新 更多