在进行 prefetch_lated 时选择使用哪个模型管理器?

问题描述 投票:0回答:1

我的 Django 应用程序中有一个产品模型,它使用自定义模型管理器,其中包含所有

prefetch_related
语句:

class ProductManager(models.Manager):
    def get_queryset(self):
        return (
            super()
            .get_queryset()
            .select_related("core_product")
            .prefetch_related("images")
            .prefetch_related("bundled_products")
        )

class Product(models.Model):
    _base_manager = ProductManager
    objects = ProductManager()

    # ... model fields

这很好用;当我使用 ORM 并在管理中使用自定义管理器时,可以防止一大堆重复查询。

问题是,当我有另一个模型对产品模型有

prefetch_related
时:它现在继承了产品的所有
prefetch_related
,尽管这不是必需的。它会导致进行一大堆不必要的查询。

class OfferManager(models.Manager):
    def get_queryset(self):
        return (
            super()
            .get_queryset()
            .select_related("flag")
            .prefetch_related("condition_products")
            .prefetch_related("limited_to_users")
            .order_by("-priority")
        )

这里的

condition_products
字段是上面的 Product 模型,只要包含这个
prefetch_related
,它的所有
prefetch_related
语句也会被继承。我怎样才能防止这种情况发生?我可以指定在
prefetch_related
中使用哪个对象管理器 - 这样就使用“裸”管理器吗?

django django-models django-orm
1个回答
0
投票

Product
添加一个简单的管理器:

class Product(models.Model):
    _base_manager = ProductManager
    objects = ProductManager()
    _simple_manager = models.Manager()

然后将此管理器与

Prefetch
对象一起使用[Django-doc]:

from django.db.models import Prefetch


class OfferManager(models.Manager):
    def get_queryset(self):
        return (
            super()
            .get_queryset()
            .select_related('flag')
            .prefetch_related(
                Prefetch('condition_products', Product._simple_manager.all()),
                'limited_to_users',
            )
            .order_by('-priority')
        )
© www.soinside.com 2019 - 2024. All rights reserved.