DBスキーマを変更することなくOracleを使用してDjangoアプリケーションを開発しています。 Thesis
がすべて存在する1つのテーブルがあります。これは、2つの別々のセット、すなわちPhdThesis
とBscMscThesis
に分けることができます。私もReview
モデルを持っています。Thesis
DBテーブルにリンクしていて、それがPhdThesis
かBscMscThesis
かどうかは気にしないので、Thesis
をabstract = False
クラスにしておきたいと思います。単一DBテーブルを使用したDjangoモデルの継承 - スーパークラスからのサブクラスへのアクセスの問題
class Thesis(models.Model):
# Primary key has to be specified explicite here for inheritance to work?
id = models.DecimalField(db_column="ID", max_digits=10, decimal_places=0, primary_key=True)
class Meta:
db_table = "DZ_PRACE_CERT"
managed = False
class Person(models.Model):
class Meta:
db_table = "MV_OSOBY"
managed = False
class BscMscThesisManager(models.Manager):
def get_query_set(self):
return super(BscMscThesisManager, self).get_query_set().filter(personbscmscdiploma__isnull=False)
class BscMscThesis(Thesis):
# needed for inheritance?
thesis = models.OneToOneField(Thesis, db_column="ID", primary_key=True, parent_link=True)
authors = models.ManyToManyField(Person, through="PersonBscMscDiploma", related_name='author_of_bsc_msc_theses')
objects = BscMscThesisManager()
class Meta:
db_table = "DZ_PRACE_CERT"
managed = False
class PersonBscMscDiploma(models.Model):
bsc_msc_thesis = models.ForeignKey(BscMscThesis, db_column="PRC_CERT_ID")
class PhdThesisManager(models.Manager):
def get_query_set(self):
return super(PhdThesisManager, self).get_query_set().filter(personphddiploma__isnull=False)
class PhdThesis(Thesis):
# needed for inheritance?
thesis = models.OneToOneField(Thesis, db_column="ID", primary_key=True, parent_link=True)
authors = models.ManyToManyField(Person, through="PersonPhdDiploma", related_name='author_of_phd_theses')
objects = PhdThesisManager()
class Meta:
db_table = "DZ_PRACE_CERT"
managed = False
class PersonPhdDiploma(models.Model):
phd_thesis = models.ForeignKey(PhdThesis, db_column="PRC_CERT_ID")
私が遭遇した問題は次のとおりです。
>>> Thesis.objects.all()[0].phdthesis
<PhdThesis: Uniwersytecki System Obsługi Studiów. Parametryzowane filtry>
>>> Thesis.objects.all()[0].bscmscthesis
<BscMscThesis: Uniwersytecki System Obsługi Studiów. Parametryzowane filtry>
>>> Thesis.objects.all()[0].phdthesis.authors.all()
[]
>>> Thesis.objects.all()[0].bscmscthesis.authors.all()
[<Person: Jan1912 Kowalski1912>]
>>> Thesis.objects.all()[0].id
Decimal('903')
>>> BscMscThesis.objects.get(id=903)
<BscMscThesis: Uniwersytecki System Obsługi Studiów. Parametryzowane filtry>
>>> PhdThesis.objects.get(id=903)
DoesNotExist: PhdThesis matching query does not exist.
PhdThesis.objects.all()
とBscMscThesis.objects.all()
意図したとおりに2点の互いに素な集合を返します。
なぜ、Thesis.objects.all()[0].phdthesis
が返されないか上記の例でDoesNotExistが返されますか?このような行動を取るために私は何ができますか?