【问题标题】:Multi table inheritance in djangodjango中的多表继承
【发布时间】:2012-08-07 07:53:43
【问题描述】:

我在 django 中使用多表继承。 Model Ninja 继承自 Person。在我的测试中,我创建了两个 Ninja 实例和一个 Person 实例。我在做:

self.assertEquals(Person.objects.count(), 3)

但是计数是 1。为什么不是 3?我的印象是为每个 Ninja 创建了一个 Person 表。

【问题讨论】:

  • 你是对的——如果你有 2 个 Ninja 实例和 1 个 Person 实例 Person.objects.count() 将是 3。一定还有其他事情发生。也许您应该显示创建代码。您正在保存实例吗?
  • 我应该注意,数 ninjas 返回 2。
  • 我正在使用 json 固定装置创建数据库。另一个奇怪的行为:Ninja.objects.all() 返回一个空列表,但 Person.objects.all() 返回一个非忍者实例。
  • 有没有办法只检查数据库,看看发生了什么?
  • 你能把你的代码贴出来吗,否则我们有白谈的风险。

标签: python django


【解决方案1】:

根据您的描述,忍者是人。因此,您有三个人:1 个普通人,2 个忍者。

这是预期的行为。如果你想知道那些不是其他东西的人(不是忍者,在你的情况下),你必须明确地向 ORM 询问它。例如:

Person.objects.
  exclude(id__in=Ninja.objects.values('id')).
  exclude(id__in=SomeOtherPersonSubclass.objects.values('id'))

我不确定代码是否正确/有效,但我认为它传达了这个想法。

您的数据库没有按预期运行(正如您在 cmets 中谈到的那样)的事实是,可以这么说,为了拥有 Ninja 实例,它需要 Person “part”。你必须有类似的东西:

[
  {
    "model": "myapp.person",
    "pk": 1,
    "fields": {
      "first_name": "John",
      "last_name": "Lennon"
    }
  },
  {
    "model": "myapp.person",
    "pk": 2,
    "fields": {
      "first_name": "Hattori",
      "last_name": "Hanzo"
    }
  },
  {
    "model": "myapp.ninja",
    "pk": 2,
    "fields": {
      "super_power": "fearless tactics"
    }
  }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多