Доступ к методу подкласса Django из суперкласса - PullRequest
0 голосов
/ 31 октября 2018

Хорошо, у меня есть две модели 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 с помощью Ticket.objects.all (). Это вернет все объекты Ticket, включая те, которые являются подклассами ProjectTicket.

Что я хотел бы сделать, так это получить доступ к подклассу get_absolute_url (), когда рассматриваемые объекты являются реальными подклассовыми объектами ProjecTicket.

Я знаю, что могу получить родительский класс из подкласса, но я хочу сделать обратное.

Кто-нибудь достиг такого? Если да, то какой подход вы выбрали?

1 Ответ

0 голосов
/ 31 октября 2018

Вот один из способов, о котором я могу думать прямо сейчас:

Я уверен, что вы знаете, что наследование моделей 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)
...