1

我正在开发一个使用Oracle的Django应用程序,但不允许修改数据库模式。 我有一个表,其中存在所有Thesis,它可以分为两个不相交的集合:PhdThesisBscMscThesis。我也Review模型,其中链接到Thesis数据库表,并不在乎是否是PhdThesisBscMscThesis,所以我想保留Thesisabstract = False类。使用单个数据库表的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()回两个不相交集的预期。

为什么Thesis.objects.all()[0].phdthesis在上例中没有返回None或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()