【问题标题】:Django override model subclass create methodDjango覆盖模型子类创建方法
【发布时间】:2016-09-15 04:46:39
【问题描述】:

我正在寻找正确的方法来覆盖子类的 create() 方法。

基本上我是这样做的:

class Base(models.Model):
    field1_base = models.IntegerField()
    def __init__(self, field1_base):
        # LOGICS
        self.field1_base = field1_base

class A(Base):
    field2_sub = models.IntegerField()
    def __init__(self, field2_sub, field1_base):
        # LOGICS
        self.field2_sub = field2_sub
        super(A, self).__init__(field1_base)

A(field2_sub=1, field1_base=2)

但是我们不能覆盖模型的__init__() 方法。

我只想在基类的方法中分配一些字段。

有没有使用create() 方法的正确方法?

当然我可以自定义Base类的create方法,但是我想要的是在创建A时同时调用Base.create和A.create,这使得情况与this question不同/p>

【问题讨论】:

  • 是的,您可以使用答案中解释的简单类方法
  • @SardorbekImomaliev 我认为非常相似。但是在我的情况下,我需要同时调用基本模型的方法。
  • 我不明白。那为什么不打电话给super(A, self).create()呢?或者你想用 A.create() 同时创建 Base 和 A 对象?
  • SardorbekImomaliev 感谢您的回答。我想将逻辑分成两部分,Base.create() 和 A.create()。如何在创建 A 类实例时调用两者?

标签: python django


【解决方案1】:

我会做这样的事情。

class Base(models.Model):
    field1_base = models.IntegerField()

    def initialize(self, *args, **kwargs):
        self.field1_base = kwargs['field1_base']

    @classmethod
    def create(cls, *args, **kwargs):
        # LOGICS
        self = cls()
        self.initialize(*args, **kwargs)
        return self

class A(Base):
    field2_sub = models.IntegerField()

    def initialize(self, *args, **kwargs):
        super(A, self).initialize(*args, **kwargs)
        self.field2_sub = kwargs['field1_base']

A.create(field2_sub=1, field1_base=2)

【讨论】:

  • 这是一个正确的答案,实际上我正在使用相同的解决方法。但是,我仍在寻找一种优雅的方式。还是谢谢大家。
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多