Django-Import-Export数据导出导入插件关于外键的处理

程序设计实验室

共 3392字,需浏览 7分钟

 ·

2021-05-19 07:39

前言

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配置的更多可以参考官方文档,不想啃文档可以看我上一篇文章:Django数据导入导出神器django-import-export使用

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 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~

  • 博客园:https://www.cnblogs.com/deali/
  • 打代码直播间:https://live.bilibili.com/11883038
  • 知乎:https://www.zhihu.com/people/dealiaxy





推荐阅读




使用Kotlin搭配Springboot开发RESTFul接口(二)自定义配置、跨域、分页
花一周时间整理的六千字长文!深入思考技术本质,跨平台开发框架AspNetCore的简单实践杂谈
我的2020回顾——技术篇
聊聊Django应用的部署和性能的那些事儿
数据分析必备技能!3分钟教会你如何在PyQt中画好看的图表
Flutter移动应用快速构建实践——状态管理、国际化、数据持久化、性能优化
无需折腾的Linux发行版:Manjaro体验与配置笔记,开箱即用 真香!



浏览 134
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报