python - 可调用以添加到引用 M2M 关系的中间模型中的额外字段的 list_display
问题描述
我有两个模型,Tender
并且Status
,它们与中间模型具有多对多关系TenderStatus
。TenderStatus
有一个额外的日期字段,表示应用每个状态的日期。我想在 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 函数以便它访问日期将不胜感激!
解决方案
对于遇到此问题的任何人,我都想出了答案。文档中涵盖了多对多关系的额外字段,但不是特别彻底,而且他们给出的示例仅适用于单个返回的对象(这 - 为什么你甚至会为此使用 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()])
希望对其他人有所帮助!