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}'], какие данные я хочу получить в этом столбце?

Спасибо

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