在继承的模型中覆盖相关经理

时间:2019-02-25 17:47:20

标签: django python-3.x inheritance django-models django-managers

在使用Django模型和相关字段/管理器时出现奇怪的问题,希望以前有人遇到过这个问题。

我定义了以下模型结构:

class CustomManager(models.Manager):
    use_for_related_fields = True

    def __init__(self, *args, **kwargs):
        self._param = kwargs.pop("param", True)

        super().__init__(*args, **kwargs)


class MyModel(models.Model):
    id = models.AutoField(primary_key=True)


class BaseRelatedModel(models.Model):

    id = models.AutoField(primary_key=True)

    objects = CustomManager()


class SubRelatedModel(BaseRelatedModel):

    related = models.ForeignKey(MyModel, related_name="related_objs", on_delete=models.CASCADE)

    objects = CustomManager(param=False)

如您所见,我有一个BaseRelatedModel,它将其管理器设置为CustomManager的实例,该实例将默认的_param值设置为True。然后,我在SubRelatedModel中将此模型子类化,并尝试使用objects的新实例覆盖CustomManager管理器,这次将其param的值设置为False

当我尝试从给定的SubRelatedModel实例访问所有相关的MyModel对象时,管理器替代似乎不起作用。

In [1]: BaseRelatedModel.objects._param 
Out[1]: True                                                        

In [2]: SubRelatedModel.objects._param  
Out[2]: False                           

In [3]: m = MyModel.objects.create()    

In [4]: m.related_objs._param           
Out[4]: True  

我希望m.related_objs._param返回False,因为那是objectsSubRelatedModel管理器的参数。

有什么想法为什么没有生效,或者我可以用其他方法解决这个问题?

谢谢!

0 个答案:

没有答案