【问题标题】:Django: Overriding 'objects' of superclass without changing the code in superclassDjango:覆盖超类的“对象”而不更改超类中的代码
【发布时间】:2018-02-27 09:09:39
【问题描述】:

我有 2 个类定义如下:

class Parent(models.Model)
    # class definition

还有二等:

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

现在我想覆盖 Parent 类的“对象”。通常它会这样:

class Parent():
    objects = Child()

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

【问题讨论】:

  • 有两个不同的父类?
  • @JerinPeterGeorge 不,只有一个父类。下面的 Parent 类是它应该如何修改的。但由于 Parent 类是第三方库,我无法修改它
  • 您是否尝试从parent class访问 child class object
  • @JerinPeterGeorge 没有。情况是这样的问题:stackoverflow.com/questions/14032329/…。但是,我不能像答案那样更改 Alpha 类。

标签: django oop django-models


【解决方案1】:
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 类中的父类的对象,并对 in 执行任何操作。

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

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

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2016-01-02
    • 1970-01-01
    • 2013-11-02
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多