首页 > 解决方案 > 可调用以添加到引用 M2M 关系的中间模型中的额外字段的 list_display

问题描述

我有两个模型,Tender并且Status,它们与中间模型具有多对多关系TenderStatusTenderStatus有一个额外的日期字段,表示应用每个状态的日期。我想在 list_display 中显示每个 Tender 的所有状态。我知道我必须在我的TenderAdmin类中创建一个可调用对象以包含在 list_display 中,尽管我能够列出状态,但我在访问中间模型中的日期字段时遇到了问题。

这是我的 models.py 的缩写版本:

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

class Status(models.Model):
    status = models.CharField(
        max_length=50,
        null=False
    )

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)

这是一个缩写的 admin.py——注意status_list可调用对象,这个可以工作,但里面没有日期。我为访问该日期所做的任何尝试都没有奏效。

class TenderAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ['name', 'status_list']

    def status_list(self, obj):
        return [x.status for x in obj.tender_status.all()]
    status_list.allow_tags = True

我已经尝试过了,但它找不到日期并返回 500 错误:

    def status_list(self, obj):
        return [str(x.date) + ': ' + x.status for x in obj.tender_status.all()]

任何帮助找到正确的方法来编写 status_list 函数以便它访问日期将不胜感激!

标签: pythondjangodjango-modelsdjango-admin

解决方案


对于遇到此问题的任何人,我都想出了答案。文档中涵盖了多对多关系的额外字段,但不是特别彻底,而且他们给出的示例仅适用于单个返回的对象(这 - 为什么你甚至会为此使用 M2M?无论如何)。要点是您必须直接查询中间模型,将obj作为参数传递给过滤器。这是我创建的可调用对象:

    def status_list(self, obj):
        statuses = TenderStatus.objects.filter(tender=obj)
        return ', '.join([str(x.date) + ': ' + str(x.status) for x in statuses.all()])

希望对其他人有所帮助!


推荐阅读