从SuperClass访问Django SubClass方法

时间:2018-10-31 16:21:48

标签: python django python-3.x django-models

好的,所以我有两个Django模型:

class Ticket(BaseModel):
  name = models.CharField(max_length=200)
  description = models.TextField(blank=True, null=True)

  def get_absolute_url(self):
    return '/core/group/ticket/{0}/'.format(self.id)

class ProjectTicket(Ticket):
    project = models.ForeignKey('Project', on_delete=models.DO_NOTHING)
    phase = models.ForeignKey('ProjectPhase', blank=True, null=True, on_delete=models.DO_NOTHING)

    def get_absolute_url(self):
        return '/different/url/structure'

现在,我正在使用Ticket.objects.all()查询所有Ticket对象。这将返回所有票证对象,包括一些ProjectTicket子类。

当有问题的对象是实际的子类ProjecTicket对象时,我想做的就是访问子类get_absolute_url()。

我知道我可以从子类中获取父类,但是我希望能够做到相反。

有人能做到这样吗?如果是这样,您采取了什么方法?

1 个答案:

答案 0 :(得分:1)

这是我现在可以想到的一种方法:

我确定您知道继承django模型会与父级建立OneToOne关系。因此,Ticket对象也是ProjectTicket类的实例,它们上将具有名为projectticket的属性。您可以检查该值并相应地返回网址:

class Ticket(...):
    ...
    def get_absolute_url(self):
        if hasattr(self, 'projectticket'):
            return self.projectticket.get_absolute_url()
        else:
            return '/core/group/ticket/{0}/'.format(self.id)