繁体   English   中英

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

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

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

它看起来像这样:

模型.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

管理员.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

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

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

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

如果您希望导出的 m2m 列包含不同的字段,您可以在字段上声明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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM