Как наследовать столбцы из родительской таблицы в Django, если модель имеет разные методы доступа?

#python #django #inheritance #django-tables2 #annotate

#питон #джанго #наследование #джанго-табл. 2 #аннотировать

Вопрос:

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

 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 следующим образом: одну для бара и одну для бара.

 class BarTable(tables.Table):    foo = tables.Columns(accessor='foo')  y = tables.Columns(accessor='y')    class Meta:  model = Bar    def render_foo(self, record):  return 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 record.bar.foo.get_x_display()   def render_z(self, record):  return f'{record.z}'   

Я попытался использовать наследование «с несколькими таблицами» в своих моделях, однако это не сработало, потому что отношение «Бар-бар» -это отношение «один ко многим». Наследование нескольких таблиц работает только для одного к одному, поэтому я вынужден использовать внешний ключ в своей модели.

Затем я попытался аннотировать каждое поле в строке в своем наборе запросов на соответствие в менеджере, подобном этому…

 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, добавляемая в набор запросов для BarRelative.objects.all (), является идентификатором foo, который является целым числом, а не объектом foo из запроса. Поэтому я в конечном итоге получаю исключение, что-то вроде «int не имеет метода get_x_display».

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