我的 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
中使用哪个对象管理器 - 这样就使用“裸”管理器吗?
向
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')
)