Как получить доступ к дополнительному полю в промежуточной таблице m2m из моей модели администратора? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть две модели Tender и Status, соединенные в связи M2M с помощью таблицы моста TenderStatus. В таблице моста есть дополнительное поле даты. Я использую встроенную форму для админки. Но я хочу иметь возможность отображать дату из промежуточной таблицы в представлении администратора. У меня есть доступ к name статуса, поэтому я могу легко показать, например, список статусов, разделенных запятыми, но я не могу понять, как получить доступ к полю даты. Я безуспешно пытался использовать вызываемый объект в классе администратора (я думаю, что просто не знаю, как получить доступ к полю даты из вызываемого объекта). Я также создал специальную функцию str для TenderStatus, но, похоже, она не обращает на это внимания. Вот код, который у меня есть:

models.py

class Tender(models.Model):
    name = models.CharField(max_length=255)
    tender_status = models.ManyToManyField(
        'Status',
        through='TenderStatus',
        related_name='tender_status'
    )

    class Meta:
        managed = False
        db_table = 'tender'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def __str__(self):
        return self.name

class TenderStatus(models.Model):
    tender = models.ForeignKey('Tender', on_delete=models.DO_NOTHING, blank=True, null=False)
    status = models.ForeignKey('Status', on_delete=models.DO_NOTHING, null=False,)
    date = models.DateField(blank=True, null=False)

    def __str__(self):
        return str(self.date) + ': ' + str(self.status)

    class Meta:
        managed = False
        db_table = 'tender_status'

class Status(models.Model):
    status = models.CharField(max_length=50)
    short_name = models.CharField(max_length=5)

    class Meta:
        managed = False
        db_table = 'status'

    def __str__(self):
        return str(self.status)

admin.py

class TenderAdmin(admin.ModelAdmin, ExportCsvMixin):

    list_display = ['name', 'status_list']

    def status_list(self, obj):
        # I BELIEVE THIS IS THE ELEMENT I NEED HELP WITH, HOW TO CALL THE DATE HERE
        # THE FOLLOWING DOES NOT WORK
        return [str(x.date) + ': ' + x.status for x in obj.tender_status.all()]

    class Meta:
        model = 'Tender'

Примечание. Мое приложение не использует пользовательские представления, оно только использует модели администратора. У меня нет возможности добавлять пользовательские представления, поскольку организация не разрешает это.

Изменить: Чтобы уточнить, я ищу способ перечислить статусы + даты в виде строки, отформатированной в list_display, используя только то, что доступно в django -admin.

...