Как наследовать столбцы от родительской таблицы django-tables2 Table, когда модель имеет разные аксессоры?

У меня есть следующие модели.

class Foo(models.Models):
    X_CHOICES = ( ('abc','Display String for ABC'),)
    x = models.CharField(max_length=10, choices=X_CHOICES)

class Bar(models.Models):
    foo = models.ForeignKey(Foo, on_delete=models.CASCADE)
    y = models.CharField(max_length=10)

class BarRelative(models.Models):
    bar = models.ForeignKey(Bar, on_delete=models.CASCADE)
    z = models.CharField(max_length=10)

Мне нужно иметь две таблицы django-tables2 следующим образом; одна для Bar и одна для BarRelative.

class BarTable(tables.Table):
    
    foo = tables.Columns(accessor='foo')
    y = tables.Columns(accessor='y')
    
    class Meta:
        model = Bar
    
    def render_foo(self, record):
        return f'{record.foo.get_x_display()}' 

class BarRelativeTable(BarTable):
    # I don't want to have to redefine the foo column just to change the accessor
    # foo = tables.Column(accessor='bar__foo')
    # I just want to add the new column z
    z = tables.Column(accessor='z')

    class Meta(BarTable.Meta):
        model = BarRelative
    
    # I don't want to redefine render_foo() just to change the accessor like this...
    # def render_foo(self, record):
    #     return f'{record.bar.foo.get_x_display()}'

    def render_z(self, record):
        return f'{record.z}' 

Я пытался использовать "многотабличное" наследование в своих моделях, однако это не сработало, поскольку Bar to BarRelative является отношением "один ко многим". Многотабличное наследование работает только для отношений один-к-одному, поэтому я вынужден использовать ForeignKey в своей модели.

Далее я попробовал аннотировать каждое поле Bar в моем QuerySet для BarRelative в менеджере следующим образом...

class BarRelativeManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().annotate(foo = F(bar__foo))

class BarRelative(model.Models):
    objects = BarRelativeManager()

Это почти работает, но я сталкиваюсь с проблемами, когда мне нужно получить доступ к get_x_display связанной модели в рендере для столбца таблицы. Аннотация foo, которая добавляется в QuerySet для Bar.objects.all(), является foo.id, который является целым числом, а не объектом foo из запроса. В итоге я получаю исключение типа "int не имеет метода get_x_display".

Есть ли способ получить желаемое поведение? Я также пытался использовать prefetch_related и select_related в моей функции get_queryset, но не смог заставить их работать.

Вернуться на верх