为 django-import-export 注册多个管理类

mic*_*eno 5 python django admin django-import-export

我希望模型有不同的导出格式,因此其中一种格式包含其他格式中不存在的附加元数据。

我可以为这两种导出格式创建一个 ModelResource 子类,但我想允许用户从管理界面中选择它们。

它是这样的:

class IngredientColourRelation(models.Model):
    ingredient = models.CharField()
    colour_label = models.CharField()
    metadata = models.CharField()

class IngredientColourLabelResource(resources.ModelResource):
    """Ingredient Resource class for importing and exporting."""

    ingredient = resources.Field()
    colour_label = resources.Field()

    class Meta:
        """Meta class"""
        model = IngredientColourRelation

        fields = ('id', 'ingredient', 'colour_label',)
        export_order = ('id', 'ingredient', 'colour_label',)
Run Code Online (Sandbox Code Playgroud)

另一个资源是这样的:

class MetadataIngredientColourLabelResource(resources.ModelResource):
    """Ingredient Resource class for importing and exporting."""

    ingredient = resources.Field()
    colour_label = resources.Field()
    metadata = resources.Field()

    class Meta:
        """Meta class"""
        model = IngredientColourRelation

        fields = ('id', 'ingredient', 'colour_label', 'metadata',)
        export_order = ('id', 'ingredient', 'colour_label', 'metadata',)
Run Code Online (Sandbox Code Playgroud)

我想我可以通过两个管理类注册这两种资源,例如:

class IngredientColourLabelAdmin(ImportExportModelAdmin):
    """Ingredient import-export Admin interface"""
    resource_class = IngredientColourLabelResource

class MetadataIngredientColourLabelAdmin(ImportExportModelAdmin):
    """Ingredient import-export Admin interface"""
    resource_class = MetadataIngredientColourLabelResource

admin.site.register(IngredientColourRelation, IngredientColourLabelAdmin)
admin.site.register(IngredientColourRelation, MetadataIngredientColourLabelAdmin)
Run Code Online (Sandbox Code Playgroud)

但当我从更改列表视图中单击导出按钮时,仅使用最新的一个。

关于如何继续允许用户选择不同的资源格式有什么建议吗?

eve*_*een 3

您可以添加代理模型,如下所示:

class IngredientColourRelationWithMetadataExport(IngredientColourRelation):
    class Meta:
        proxy = True
        verbose_name = "IngredientColourRelation (Exports Metadata)"
Run Code Online (Sandbox Code Playgroud)

该模型将与原始模型共享相同的数据库表并返回相同的数据,但您可以在Admin中单独注册。如果有用的话,您还可以添加其他方法和属性(但不是字段)。

更改模型引用以MetadataIngredientColourLabelResource使用代理模型:

class MetadataIngredientColourLabelResource(resources.ModelResource):
    """Ingredient Resource class for importing and exporting."""

    ingredient = resources.Field()
    colour_label = resources.Field()
    metadata = resources.Field()

    class Meta:
        """Meta class"""
        model = IngredientColourRelationWithMetadataExport

        fields = ('id', 'ingredient', 'colour_label', 'metadata',)
        export_order = ('id', 'ingredient', 'colour_label', 'metadata',)
Run Code Online (Sandbox Code Playgroud)

然后你可以在Admin中分别注册这两个模型:

admin.site.register(IngredientColourRelation, IngredientColourLabelAdmin)
admin.site.register(IngredientColourRelationWithMetadataExport, 
    MetadataIngredientColourLabelAdmin)
Run Code Online (Sandbox Code Playgroud)