我有抽象模型AB,还有一个子模型C.

class A(models.Model):
    field1 = models.CharField(max_length=24)

    class Meta:
        abstract = True


class B(models.Model):
    field1 = models.CharField(max_length=24)

    class Meta:
        abstract = True

   def make_A(self):
      A(field1=self.field1).save()


class C(B):
    pass

如果我try 运行C.make_A(),我得到TypeError: Abstract models cannot be instantiated错误.所以我不得不在子元素身上重写make_A方法.有没有办法编写一个在抽象B下实例化A的方法?

推荐答案

问题不是B是抽象的,问题是A是抽象的.但您可以创建一个"模板方法",然后在C中使用以下命令对其进行稍微更改:

class B(models.Model):
    concrete_A = None
    field1 = models.CharField(max_length=24)

    class Meta:
        abstract = True

    def make_A(self):
        self.concrete_A.objects.create(field1=self.field1)


class C(B):
    concrete_A = SubA

SubAAconcrete个子类.

话虽如此,鉴于我理解你的目标,你似乎只是在某种程度上复制了django-simple-history [readthedocs.io]正在做的事情.

Python相关问答推荐

将特定列信息移动到当前行下的新行

将整组数组拆分为最小值与最大值之和的子数组

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

对所有子图应用相同的轴格式

Python解析整数格式说明符的规则?

为什么抓取的HTML与浏览器判断的元素不同?

Pandas—在数据透视表中占总数的百分比

如何在turtle中不使用write()来绘制填充字母(例如OEG)

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

当条件满足时停止ODE集成?

如何使用正则表达式修改toml文件中指定字段中的参数值

Tensorflow tokenizer问题.num_words到底做了什么?

解决Geopandas和Altair中的正图和投影问题

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

多索引数据帧到标准索引DF

为什么在更新Pandas 2.x中的列时,数据类型不会更改,而在Pandas 1.x中会更改?

如何将ManyToManyfield用于Self类

如何在开始迭代自定义迭代器类时重置索引属性?