我有一个Django模型,它有几个ForeignKey模型关系,我需要将它们组合成单个记录。
如果您查看下面的plaque
模型,您会注意到我与veteran
模型之间存在ForeignKey关系。我创建了一个没有真正思考它的老手模型,现在需要将老手字段添加到我的斑块模型中,但需要先导出所有数据,重建我的斑块模型,然后重新导入数据。
我已经安装了django-import-export,它适用于单个模型。我导出了我的牌匾数据,在退伍军人的领域,它只是添加了相关退伍军人的身份证号码。我想做的事情,如果可能的话,实际上是导出我的牌匾模型,而不是相关的退伍军人身份证号码,来自退伍军人模型的实际数据(first_name,last_name等)。我也在使用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
答案 0 :(得分: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',)