Как наследовать столбцы от родительской таблицы 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, но не смог заставить их работать.