3

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

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

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

4

1 回答 1

2

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

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

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

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

您的数据库未按预期运行(正如您在评论中谈到的那样)的事实是因为,为了拥有一个 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"
    }
  }
]
于 2012-08-08T02:56:14.470 回答