【问题标题】:Access Django SubClass Method from SuperClass从 SuperClass 访问 Django 子类方法
【发布时间】:2018-10-31 16:21:48
【问题描述】:

好的,所以我有两个 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 对象。这将返回所有 Ticket 对象,包括一些 ProjectTicket 子类。

当有问题的对象是实际的子类 ProjecTicket 对象时,我希望能够访问子类 get_absolute_url()。

我知道我可以从子类中获取父类,但我希望能够反过来。

有没有人取得过这样的成就?如果是这样,你采取了什么方法?

【问题讨论】:

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


    【解决方案1】:

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

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

    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)
    

    【讨论】:

    • 谢谢,这绝对是我尝试并为这个特定用例工作的第一件事,但我可能会有多个从 Ticket 继承的子类,可能有几十个。这似乎会变得繁重,因此我避免了它。不过,我应该注意到我试过了。
    • @Craig 我认为没有其他方法可以做到这一点。因为当您查询Ticket 对象时,返回的对象将是Ticket 类的实例。由于父类不知道它的子类,因此您不能从 Ticket 的实例调用 ProjectTicket.get_absolute_url
    • 我认为您是正确的,为了其他可能有类似的、更有限的用例的人,我会将其标记为正确。
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2021-07-09
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多