Django:覆盖'对象'超类的更改,而不更改超类中的代码

时间:2018-02-27 09:09:40

标签: django oop django-models

我有两个类定义如下:

class Parent(models.Model)
    # class definition

第二节课:

class Child(models.Manager):
    def get_queryset(self):
        pass

现在我要覆盖'对象'班级的父母。通常情况会是这样的:

class Parent():
    objects = Child()

但我无法修改Parent类,因为它是第三方库。 这个问题有解决办法吗?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,这将有效<

class Parent(models.Model): # third party model class
    # class definition

class Child(models.Manager):
    def get_queryset(self):
        pass

class NewParent(Parent):
    objects = Child()



并且可以通过

访问模型对象
obj = NewParent.objects.get(id=instance_id)

答案 1 :(得分:0)

setattr(Parent, 'objects', Child())

将此行写在您拥有经理类的文件末尾。 这将覆盖父类的对象属性(如果存在)或添加对象属性。 例如:

from django.db import models

class abc(models.Model):
    pass


class pqr(models.Manager):
    def get_queryset(self, *args, **kwargs):
        print('in get_queryset')

setattr(abc, 'objects', pqr())

现在在shell中获取或创建父类的对象,在此示例 abc 类中执行任何操作。

a = abc()
a.objects.all()
  

但是这个方法是错误的,它会覆盖对象属性,如果你想使用这个方法,那么使用不同于对象的属性名称