【发布时间】:2021-05-22 23:05:16
【问题描述】:
我有一个自定义模型定义如下,get() 方法覆盖
class CustomQuerySetManager(models.QuerySet):
def get(self, *args, **kwargs):
print('Using custom manager')
# some other logics here...
return super(CustomQuerySetManager, self).get(*args, **kwargs)
class CustomModel(models.Model):
objects = CustomQuerySetManager.as_manager()
class Meta:
abstract = True
然后我有两个模型定义为
class Company(CustomModel):
name = models.CharField(max_length=40)
class People(CustomModel):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
如果我像People.objects.get(pk=1) 一样直接使用get(),那么它可以工作,“使用自定义管理器”会打印出来,但是如果我尝试获取外键信息,django 仍然使用默认管理器中的get() 方法,例如,没有打印任何内容,并且定义的其余逻辑将不会被执行
someone = People.objects.get(id=1) # prints Using custom manager, custom logic executed
company_name = someone.company.name # nothing gets printed, custom logic does not execute
即使外键模型也使用我的自定义模型类,模型中的外键字段是否使用不同的管理器?有没有办法让我的自定义 get() 方法适用于所有字段?
【问题讨论】:
标签: django django-models