【Django】在admin后台显示数据库中没有的用户自定义字段
有两个model,一个是资产信息Asset
class Asset(BaseModel):
"""资产信息model"""
type = models.ForeignKey(AssetType, on_delete=models.CASCADE, verbose_name="资产类型")
name = models.CharField(verbose_name="资产名称", max_length=50)
numbers = models.IntegerField(verbose_name="资产数量", default=0)
storage_time = models.DateTimeField(verbose_name="入库时间")
serial_number = models.CharField(verbose_name="资产序列号", max_length=50, null=True, blank=True)
state = models.CharField(verbose_name="资产状态", choices=ASSET_STATE, max_length=2)
position = models.CharField(verbose_name="资产位置", max_length=200)
另一个是资产使用信息UsageRecord
class UsageRecord(BaseModel):
"""资产使用记录model"""
asset = models.ForeignKey(Asset, on_delete=models.CASCADE, verbose_name="资产名称")
use_type = models.CharField(verbose_name="使用类型", max_length=4, choices=USE_TYPE)
unit = models.ForeignKey(Unit, verbose_name="使用单位", on_delete=models.CASCADE)
person = models.CharField(verbose_name="责任人", max_length=20, default="")
mobile = models.CharField(verbose_name="责任人联系方式", max_length=11)
leave_time = models.DateTimeField(verbose_name="出库时间", null=True, blank=True)
position = models.CharField(verbose_name="资产位置", max_length=200)
return_time = models.DateTimeField(verbose_name="归还时间", null=True, blank=True)
check_up = models.CharField(verbose_name="检查情况", max_length=200, null=True, blank=True)
remark = models.CharField(verbose_name="备注", max_length=200, null=True, blank=True)
在admin中,需要在资产信息Asset的列表中显示资产使用信息UsageRecord的信息,因为外键是定义在UsageRecord中的,在Asset中显示使用记录需要在admin类中自定义,代码如下:
@admin.register(Asset)
class AssetAdmin(admin.ModelAdmin):
list_display = ('type', 'name', 'numbers', 'storage_time', 'serial_number', 'state', 'position', 'records')
list_editable = ('state',)
search_fields = ('serial_number',)
def records(self, instance):
"""
自定义records字段,显示资产的使用记录。
instance参数,可以看成是Asset对象本身。
如果有使用记录,返回第一个记录,如果没有使用记录,返回一个空列表。
records.short_description 定义在admin中显示的列名称,相当于是model中的verbose_name
"""
usage_record = UsageRecord.objects.filter(asset=instance.id).order_by('-add_time')
if usage_record:
return usage_record[0]
else:
return []
records.short_description = "使用记录"