【问题标题】:How to export a Django model including ForeignKey model relationships into a combined text file如何将包含 ForeignKey 模型关系的 Django 模型导出到组合文本文件中
【发布时间】:2017-08-15 23:23:28
【问题描述】:

我有一个 Django 模型,它有几个 ForeignKey 模型关系,我需要将它们组合成单个记录。

如果您查看下面的 plaque 模型,您会注意到我与 veteran 模型有 ForeignKey 关系。我创建了一个老兵模型并没有真正考虑清楚,现在需要将老兵字段添加到我的斑块模型中,但需要先导出所有数据,重建我的斑块模型,然后重新导入数据。

我已经安装了django-import-export,它适用于单个模型。我导出了我的牌匾数据,并在退伍军人字段中添加了相关退伍军人的身份证号。如果可能的话,我想做的实际上是导出我的斑块模型,而不是相关的退伍军人 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

【问题讨论】:

    标签: python django postgresql django-models


    【解决方案1】:

    这应该可行,(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',)
    

    【讨论】:

    • 谢谢,这让我朝着正确的方向前进。我在原始问题中添加了我的代码,以便其他人可以看到如何准确导出模型以及 ForeignKey 模型的值而不是 id。
    • @StudioRooster 真的很高兴它有帮助 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2013-09-12
    • 2019-07-11
    • 2019-01-19
    • 2011-08-21
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多