代码之家  ›  专栏  ›  技术社区  ›  Charles Smith

如何将包括ForeignKey模型关系的Django模型导出到组合文本文件中

  •  2
  • Charles Smith  · 技术社区  · 7 年前

    如果你看我的 plaque 在下面的模型中,你会注意到我和一个 veteran 模型我创建了一个退伍军人模型,但没有真正仔细考虑,现在需要将退伍军人字段添加到我的斑块模型中,但需要先导出所有数据,重建斑块模型,然后重新导入数据。

    我有 django-import-export 已安装,适用于单型号。我导出了我的斑块数据,在退伍军人字段中,它只添加了相关退伍军人的id号。如果可能的话,我想做的是导出我的斑块模型,而不是相关的退伍军人id号,而是来自退伍军人模型的实际数据(名字、姓氏等)。如果有帮助的话,我也在使用PostgreSQL。有什么想法吗?非常感谢。

    class Plaque(models.Model):
         created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='plaques', default=1)
         group = models.ForeignKey(Group, blank=True, null=True, verbose_name='Group Name')
         veteran = models.ForeignKey(Veteran, blank=True, null=True)
         ...
    

    更新-这是我的整个资源模型解决方案。这将导出一个文件,其中包含所有ForeignKey模型字段的字符串值。

    from import_export import resources, fields
    from import_export.widgets import ForeignKeyWidget
    from import_export.admin import ImportExportModelAdmin
    from .models import Plaque, Group, Veteran, Service, Branch, War, Rank
    from django.contrib import admin
    
    
    class PlaqueResource(resources.ModelResource):
        vet_first = fields.Field(column_name='Veteran First', attribute='veteran', widget=ForeignKeyWidget(Veteran, field='first_name'))
        vet_middle = fields.Field(column_name='Veteran Middle', attribute='veteran', widget=ForeignKeyWidget(Veteran, field='middle_name'))
        vet_last = fields.Field(column_name='Veteran Last', attribute='veteran', widget=ForeignKeyWidget(Veteran, field='last_name'))
        vet_display = fields.Field(column_name='Veteran Display Name', attribute='veteran', widget=ForeignKeyWidget(Veteran, field='display_name'))
        vet_nick = fields.Field(column_name='Veteran Nickname', attribute='veteran', widget=ForeignKeyWidget(Veteran, field='nickname'))
        vet_bio = fields.Field(column_name='Veteran Biography', attribute='veteran', widget=ForeignKeyWidget(Veteran, field='biography'))
        vet_branch = fields.Field(column_name='Veteran Branch - service model', attribute='service', widget=ForeignKeyWidget(Service, field='branch'))
        vet_rank = fields.Field(column_name='Veteran Rank - service model', attribute='service', widget=ForeignKeyWidget(Service, field='rank'))
        vet_war = fields.Field(column_name='Veteran War - service model', attribute='service', widget=ForeignKeyWidget(Service, field='war'))
        vet_branch2 = fields.Field(column_name='Veteran Branch - branch model', attribute='service', widget=ForeignKeyWidget(Branch, field='branch'))
        vet_rank2 = fields.Field(column_name='Veteran Rank - rank model', attribute='service', widget=ForeignKeyWidget(Rank, field='rank'))
        vet_war2 = fields.Field(column_name='Veteran War - war model', attribute='service', widget=ForeignKeyWidget(War, field='war'))
        group_name = fields.Field(column_name='Group Name', attribute='group', widget=ForeignKeyWidget(Group, field='group_name'))
        group_type = fields.Field(column_name='Group Type', attribute='group', widget=ForeignKeyWidget(Group, field='group_type'))
    
        class Meta:
            model = Plaque
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   The_Cthulhu_Kid    7 年前

    from the docs )

    # Or however your resources look
    class PlaqueResource(resources.ModelResource):
    
        class Meta:
            model = Plaque
            fields = (<other_fields>, 'veteran__first_name', 'veteran__last_name',)