Django-Import-Export外掛關於外來鍵的處理
阿新 • • 發佈:2021-06-15
前言
Django-Import-Export是一款很好用很方便的Django資料匯出匯入外掛,可以和DjangoAdmin管理後臺完美整合,只需要少量的程式碼配置即可方便實現你要的多種格式匯出匯入,關於這個外掛的使用更多可以看我之前的文章:Django資料匯入匯出神器django-import-export使用
之前我在使用中都是專門做了一個原始資料的表來存匯入的資料,然後再對原始資料表做一些資料處理,把資料存到其他表才能真正使用這些資料。(不是很好的做法好像)
然後現在需要的是在已有表結構的基礎上,匯入資料,而且我需要匯入資料的這個表,裡面還有幾個外來鍵,這就涉及到對於外來鍵的處理了。
於是在網上查了很久(面向Google程式設計),國內的資料以參考資料的兩個文章為主,看了下類似奇技淫巧的hack方式解決的,感覺一般般,這樣hack方式不能讓我滿意,於是放棄Google,直接啃官方文件(我好後悔為啥不一開始就啃官方文件……)
解決方案
真正的解決方案,還得看官方文件。
模型配置
先看看模型是怎麼定義的,這裡我把官方的examples放出來,我自己專案的模型欄位太多了,還是看官方的比較清楚。
class Author(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Category(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Book(models.Model): name = models.CharField('Book name', max_length=100) author = models.ForeignKey(Author, blank=True, null=True) author_email = models.EmailField('Author email', max_length=75, blank=True) imported = models.BooleanField(default=False) published = models.DateField('Published', blank=True, null=True) price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) categories = models.ManyToManyField(Category, blank=True) def __str__(self): return self.name
Resource配置
關於Resource配置的更多可以參考官方文件,不想啃文件可以看我上一篇文章:文章連結
from import_export import fields, resources from import_export.widgets import ForeignKeyWidget class BookResource(resources.ModelResource): author = fields.Field( column_name='author', attribute='author', widget=ForeignKeyWidget(Author, 'name')) class Meta: fields = ('author',)
搞定,這樣在匯入的時候會自動關聯外來鍵author。
參考資料
- 官方文件:https://django-import-export.readthedocs.io/en/latest/api_widgets.html#import_export.widgets.ForeignKeyWidget
- Django-10-匯入匯出功能優化:https://www.jianshu.com/p/f82a465a41d8
- django-import-export關聯外來鍵在後臺管理中匯入匯出的辦法:https://blog.csdn.net/weixin_38496380/article/details/104717236
歡迎交流
程式設計實驗室專注於網際網路熱門新技術探索與團隊敏捷開發實踐,在公眾號「程式設計實驗室」後臺回覆 linux、flutter、c#、netcore、android、kotlin、java、python 等可獲取相關技術文章和資料,同時有任何問題都可以在公眾號後臺留言~