【问题标题】:multiple model object inheritance in djangodjango中的多模型对象继承
【发布时间】:2014-07-19 03:16:14
【问题描述】:

在 django 中,我有三个模型:

class Base(models.Model):
    pass

class ChildA(Base):
    pass

class ChildB(Base):
    pass

我使用的是 MySQL,所以在syncdb 之后,我有三个表:

tb_basetb_childatb_childbtb_childatb_childb的主键也是tb_base主键的外键。

从结构上讲,我可以拥有 Model BaseChildAChildB 的对象 相同的ID。

例如,现在我执行:

childa = ChildA.objects.create()
print(childa.pk) # printed: 1

以上代码在tb_basetb_childa中添加了一行,主键id为 1.

现在我想创建一个ChildB 实例,但它共享childa 的基础对象。

例如:

# this doesn't work, but shows what I want to do. 
childb = ChildB.objects.create(base=Base.objects.get(pk=1))

我的最终目的是在不同的情况下使用ChildAChildB 模型,但是如果更新了基础部分字段,他们可以共享它。

另外,我想考虑删除对象时的行为。

【问题讨论】:

  • 想想当你继承时不需要创建一个 childb 对象,因为创建了一个基 1 的主键,两个类都有相同的 1 为什么要创建一个新的

标签: python mysql django


【解决方案1】:

我认为这没有多大意义,但你可以这样做:

childb = ChildB.objects.create(base_ptr_id=1))

您可以考虑定义另一个类来保存 ChildA 和 ChildB 之间的共享数据。

from django.db import models


class SharedData(models.Model):
    data = models.CharField("Data", max_length=50)


class Base(models.Model):
    shared_data = models.ForeignKey(SharedData)


class ChildA(Base):
    pass


class ChildB(Base):
    pass

【讨论】:

  • 在您的解决方案中,问题仍然存在。
  • 究竟是哪个问题?
【解决方案2】:

你可以这样试试:

child_b = Base.objects.get(pk=1)
child_b.__class__= ChildB
child_b.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2013-12-22
    相关资源
    最近更新 更多