django - Django 管理页面 - 导出字段 + 可调用字段
问题描述
Django 版本:1.11 Python:2.7 包:django-import-export
我正在尝试导出 Django 管理页面的“可调用”字段。(参考:https ://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display )
在他们的示例中,他们的 PersonAdmin 有一个“可调用” list_display
。
def upper_case_name(obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Name'
class PersonAdmin(ExportMixin, admin.ModelAdmin):
list_display = (upper_case_name,)
对于资源,我想我也可以导出可调用字段。
class PersonResource(resources.ModelResource):
class Meta:
model = Person
fields = ( "first_name",
"last_name",
"upper_case_name", )
但是,我会得到 Person has no field named upper_case_name
。有没有办法导出可调用字段?
从文档来看,您确实可以导出不存在的字段。
https://django-import-export.readthedocs.io/en/latest/getting_started.html
他们的例子是:
from import_export.fields import Field
class BookResource(resources.ModelResource):
full_title = Field()
class Meta:
model = Book
def dehydrate_full_title(self, book):
return '%s by %s' % (book.name, book.author.name)
我复制了这个并尝试了:
class PersonResource(resources.ModelResource):
upper_case_name = Field()
class Meta:
model = Person
def dehydrate_upper_case_name(self, obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
我试图做同样的事情,但我会得到错误 Person has no field named upper_case_name
。有什么想法吗?
提前致谢!
解决方案
看起来有两种方法可以做到这一点:
方法一
来自:https ://django-import-export.readthedocs.io/en/latest/api_fields.html
- 属性 – 实例属性或可从对象调用的字符串。
在模型中添加一个可调用函数。
class Person(models.Model):
def get_upper_case_name(self):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name = property(get_upper_case_name)
现在在 PersonResource 文件中,声明新的自定义字段。
class PersonResource(resources.ModelResource):
upper_case_name = Field(attribute="get_upper_case_name", column_name="Upper Case Name")
class Meta:
model = Person
fields = ( "first_name",
"last_name",
)
方法二
这都可以在资源中完成:
class PersonResource(resources.ModelResource):
upper_case_name = fields.Field(column_name="Upper Case Name")
def dehydrate_upper_case_name(self, obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
class Meta:
model = Person
fields = ( "first_name",
"last_name",
"upper_case_name"
)
干杯!
推荐阅读
- .net - Visual Basic .NET VS 2017 指令 - 缺少构建选项卡
- php - PHP 认为我的表中不存在现有用户
- java - Databricks Notebook Scala Spark 连接到 MongoDB 无法初始化类 com.mongodb.spark.config.ReadConfig$
- swift - Swift 在运行时构建泛型类型
- c# - 如何通过c#处理命令行中的空格
- windows - 更改 Windows 子文件夹中特定文件类型的属性
- reactjs - 我如何从数据库中获取价值
- vb.net - 如何将 ComboBox 中的双精度数传递给数学运算?
- laravel - 如何以一对多关系查询父字段和子字段中的 where 条件
- imagemagick - Imagemagick 命令获取图像元数据大小