2017-08-15 15 views
1

我有一個Django模型,它具有多個ForeignKey模型關係,我需要將它們合併到單個記錄中。如何將包含ForeignKey模型關係的Django模型導出到組合文本文件中

如果你看看我的plaque模型下面,你會發現我有一個ForeignKey與veteran模型的關係。我創建了一個沒有真正考慮過的老牌模型,現在需要將我的老牌領域添加到我的牌匾模型中,但需要先導出所有數據,重新構建我的牌匾模型,然後重新導入數據。

我已經安裝了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 

回答

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',) 
+0

謝謝你,這讓我在正確的方向前進。我在原始問題中添加了我的代碼,以便其他人可以看到如何導出模型以及ForeignKey模型的值而不是id。 –

+0

@StudioRooster真的很高興它幫助=) –