如何通过选择从导入导出(管理集成)Django 导入?

How to Import from Import-Export(Admin integration) Django with choices?

我有一个模型:

class Student(models.Model):
TITLE = (
    ('Title_Mr', ('Mr')),
    ('Title_Ms', ('Ms')),
)
Name = models.CharField(max_length = 25, default = '')
Title = models.CharField(max_length = 32, choices = TITLE, blank=True, null = True)
...

通过选择和导入-导出功能,我想导入职位值为“Mr”或“Ms”的学生。

我试过的是这个答案

但显然这是为了出口? 如果我想导入它该怎么办。这是我的 resources.py

from import_export import resources, fields

从 main.models 导入 Schulungsteilnehmer

class StudentsResource(resources.ModelResource):
    Title = fields.Field(attribute='get_Title_display', column_name=('Title'))
    class Meta:
        model = Student
        exclude=('id',)
        import_id_fields = ('StudentID',)

我可以毫无问题地导入,但是选择字段是空的,例如,当我在管理面板中单击一个学生进行编辑时。 如何将值保存为选项选择值?

查看 documentation for choices:

The first element in each tuple is the actual value to be set on the model, and the second element is the human-readable name.

因此,在您的情况下,'Title_Mr' 或 'Title_Ms' 将是存储在数据库中的值。

这意味着如果您在 Resource 中如下定义 Title 字段,您将能够成功导入:

title = fields.Field(attribute='title', column_name='Title')

(我根据 style guidelines 将字段名称设为小写)

  1. attribute 是要设置的模型 class 上的属性。

  2. column_name是导入文件中的header名称。

  3. 这仅在导入文件中的数据与 choices 声明匹配时才有效(例如 'Title_Mr')

但是,您说源数据是 'Mr' 或 'Ms'。要解决这个问题,最简单的方法是使 'Mr' 和 'Ms' 成为 choices 声明的值:

TITLE = (
    ('Mr', ('Mr')),
    ('Ms', ('Ms')),
)

但如果这不可能,那么您将不得不创建一个 custom widget,它可以解析源数据(例如 'Mr')并将其转换为正确的值(例如 'Title_Mr').

有关创建自定义小部件的帮助,source 中有示例。