Django-tables2: Как я могу добавить столбцы на основе набора запросов, который может меняться
У меня есть таблица, созданная в django tables2, которая отображает связанные поля моей модели queryset. Однако есть поле "многие-ко-многим", и я хотел бы отобразить каждый объект в виде столбца. Очевидно, что это переменная, поэтому я не могу жестко закодировать это в столбцах таблицы, как я бы сделал с другими полями.
Один из вариантов - поместить все объекты M2M в один столбец, но это может стать довольно беспорядочным (я не предполагаю, что это будет >3 ссылки M2M в целом, так что отдельные столбцы будут лучше).
Мне удалось использовать метод init таблицы, чтобы получить новый столбец для каждой ссылки, однако я не могу понять, как на самом деле получить данные, которые мне нужны...
модели:
class GenomeBuild(models.Model):
build_name = models.CharField(max_length=6)
in_use = models.BooleanField(default=False)
def __str__(self):
return f"{self.build_name}"
class Variant(models.Model):
chromosome = models.CharField(max_length=2)
genomic_location = models.CharField(max_length=50)
ref = models.CharField(max_length=1024)
alt = models.CharField(max_length=1024)
var_type = models.CharField(max_length=60)
class Meta:
db_table = "variant"
unique_together = (
("chromosome", "genomic_location",
"ref", "alt",),)
def __str__(self):
return variant_str_formatting(variant=self)
@property
def vNomen(self):
return vNomen_str(variant=self)
class VariantBuild(models.Model):
variant_id = models.ForeignKey(
Variant, on_delete=models.CASCADE,
db_column="variant_id",
related_name="variant_id"
)
build_id = models.ForeignKey(
GenomeBuild, on_delete=models.CASCADE,
db_column="build_id",
)
def __str__(self):
return f"{self.variant_id} ({self.build_id})"
class VariantGeneTranscript(models.Model):
variant_builds = models.ManyToManyField(
VariantBuild, db_column="variant_builds")
gene_transcript_id = models.ForeignKey(
GeneTranscript,
on_delete=models.CASCADE,
db_column="gene_transcript_id")
consequence = models.CharField(max_length=60)
cNomen = models.CharField(max_length=100)
pNomen = models.CharField(max_length=100)
Таблицы:
class VariantTable(tables.Table):
gene = tables.Column(accessor='gene_transcript_id.gene_id',
verbose_name='Gene')
transcript = tables.Column(accessor='gene_transcript_id.transcript_name',
verbose_name='Transcript')
variant = tables.TemplateColumn("{% for vb_obj in record.variant_gene_transcript_id.variant_builds.all %}\
{% if vb_obj.in_use %}{{ vb_obj.variant_id }}{% endif %}{% endfor %}",
verbose_name='record',
orderable=False)
cNomen = tables.Column(accessor='cNomen',
verbose_name='cNomen')
pNomen = tables.Column(accessor='pNomen',
verbose_name='pNomen')
consequence = tables.Column(accessor='consequence',
verbose_name='Consequence')
class Meta:
empty_text = 'No variants found.'
row_attrs = {
'data_id': lambda record: record.pk,
'instance': lambda record: record
}
def __init__(self, data, *args, **kwargs):
gb_obj = GenomeBuild.objects.get(in_use=True)
self.base_columns['variant'].verbose_name = f"Variant ({gb_obj.build_name})"
gb_qs = GenomeBuild.objects.filter(in_use=False)
for o in gb_qs:
self.base_columns[f'variant_{o.build_name}'] = tables.Column(
accessor=f'variant_{o.build_name}',
verbose_name=f'variant_{o.build_name}'
)
super(VariantTable, self).__init__(data, *args, **kwargs)
В итоге в колонке variant я получаю объект in_use=True VariantBuild с именем, относящимся к сборке. Однако в колонке variant_{{build}} пусто. Как мне указать self.base_columns[f'variant_{o.build_name}'], какие данные я хочу получить в этом столбце?
Спасибо