使用 django-input-output 导出多对多关系中的字段数据仅显示主键

Exporting field data in many to many relationships using django-input-output only shows primary key

我正在尝试使用 django-import-export 包从 Django 管理页面导出我的数据库中的数据。当我导出模型时,我还想显示多对多关系中每个 object 的特定字段中的数据。

看起来像这样:

models.py

class Item(models.Model):
    part_number = models.CharField(max_length=50, unique=True)
    description = models.CharField(max_length=250, blank=True)

    def __str__(self):
        return self.part_number

class Bin(models.Model):
    name = models.CharField(max_length=50, unique=True)
    items = models.ManyToManyField(Item, blank=True)

    def __str__(self):
        return self.name

admin.py

class ItemResource(ModelResource):
    class Meta:
        model = Item
        fields = ('part_number', 'description')

@admin.register(Item)
class ItemAdmin(ImportExportModelAdmin):
    save_as = True
    resource_class = ItemResource

class BinResource(ModelResource):
    class Meta:
        model = Bin
        fields = ('name', 'item__part_number')

@admin.register(Item)
class ItemAdmin(ImportExportModelAdmin):
    save_as = True
    resource_class = BinResource

我希望它的工作方式是,如果我导出 Items,我将得到一个文档,其中一列是所有部件号,另一列是描述。这很好用。但是,我还希望当我导出 Bins 时,一列会显示所有名称,而另一列会显示与该 bin 关联的项目的所有部件号的列表。我实际得到的是一个名为 part_number 的列,但任何列中都没有任何内容。

如果我用 fields = ('name', 'item') 替换 fields = ('name', 'item__part_number'),将会有一个标题为 item 的列,但它会包含一个主键列表,这没有帮助。我如何导出它以显示我正在寻找的相关字段中的信息?

请注意,我在使用外键之前已经这样做了,只是无法让多对多字段起作用。我在文档中找不到任何地方显示如何使用 dunder 表示法表示各种模型关系。

如果您希望导出的 m2m 列包含不同的字段,您可以在字段上声明 ManyToManyWidget 时简单地传递字段名称。

例如:

from import_export.widgets import ManyToManyWidget

class BinResource(ModelResource):
    
    item = Field(
        attribute='item',
        widget=ManyToManyWidget(Category, field='part_number',
                                        separator='|')
    )
    
    class Meta:
        model = Bin
        fields = ('name', 'item')

这将导致 part_number 显示在导出列中,而不是 id,例如:

name,item
name1,part1|part2