#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, но я также не смог заставить их работать.