1

DBスキーマを変更することなくOracleを使用してDjangoアプリケーションを開発しています。 Thesisがすべて存在する1つのテーブルがあります。これは、2つの別々のセット、すなわちPhdThesisBscMscThesisに分けることができます。私もReviewモデルを持っています。Thesis DBテーブルにリンクしていて、それがPhdThesisBscMscThesisかどうかは気にしないので、Thesisabstract = 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が返されますか?このような行動を取るために私は何ができますか?

答えて

1

これを行うにはDjangoにとって簡単な方法はないようです。私はis_phd()is_bsc_msc()のようなメソッドを実装し、次のように使用しました。

def get_absolute_url(self): 
    if self.is_phd(): 
     return self.phdthesis.get_absolute_url() 
    else: 
     return self.bscmscthesis.get_absolute_url() 
関連する問題