自定义管理器中的select_related不能在Django管理员中使用吗?

时间:2019-12-16 12:47:47

标签: python django django-admin django-custom-manager

我正在尝试在自定义管理器中实现select_related,以优化Django admin中的数据库查询数量。

managers.py:

class TargetShapeColorManager(models.Manager):
def get_queryset(self):
    return TargetShapeColorQuerySet(self.model, using=self._db)

def add_base_target_shape_data(self):
    return self.get_queryset().select_related('base_target_shape').add_base_target_shape_data()

admin.py:

class TargetShapeColorAdmin(admin.ModelAdmin):
model =  TargetShapeColor 

def get_queryset(self, request):
    queryset = super().get_queryset(request)
    return queryset.add_base_target_shape_data() 

以这种方式运行它时,我有7个查询(包括3个与“ base_target_shape”的3个相对应的查询,应该由select_related避免)

如果select_related位于管理员中(请参见下文),则一切正常,并且我只有4个查询。

managers.py:

class TargetShapeColorManager(models.Manager):
def get_queryset(self):
    return TargetShapeColorQuerySet(self.model, using=self._db)

def add_base_target_shape_data(self):
    return self.get_queryset().add_base_target_shape_data()

admin.py:

class TargetShapeColorAdmin(admin.ModelAdmin):
model =  TargetShapeColor 

def get_queryset(self, request):
    queryset = super().get_queryset(request)
    return queryset.select_related('base_target_shape').add_base_target_shape_data() 

有人可以告诉我这是否是正常行为吗?

并向我解释为什么select_related('base_target_shape')位于自定义管理器中时为何不起作用?

预先感谢

0 个答案:

没有答案