如何通过Django ORM将字典数据写入SQLite?Django1.11对应模型及写入方法是什么
适配模型定义
首先根据你提供的两层数据结构(帖子数据、嵌套地址的用户数据),按关系型数据库范式拆分4个模型,对应存到SQLite的4张表,直接在你Django应用的models.py里写入如下代码即可:
from django.db import models # 最内层的地理坐标模型 class Geo(models.Model): lat = models.CharField(max_length=32) lng = models.CharField(max_length=32) # 地址模型,关联地理坐标 class Address(models.Model): street = models.CharField(max_length=128) suite = models.CharField(max_length=64) city = models.CharField(max_length=64) zipcode = models.CharField(max_length=32) geo = models.ForeignKey(Geo, on_delete=models.CASCADE) # 用户模型,关联地址 class User(models.Model): id = models.IntegerField(primary_key=True) # 直接用数据里的id作为主键 name = models.CharField(max_length=128) username = models.CharField(max_length=64) email = models.EmailField() address = models.ForeignKey(Address, on_delete=models.CASCADE) # 帖子模型,关联对应用户 class Post(models.Model): id = models.IntegerField(primary_key=True) # 直接用数据里的id作为主键 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts') title = models.CharField(max_length=256) body = models.TextField()
写完后执行python manage.py makemigrations和python manage.py migrate就能在SQLite里生成对应表结构。
如果不需要对地址、坐标做单独关联查询,也可以把嵌套的address字段直接序列化为JSON字符串存在TextField里,减少表的数量,适合简单场景。
数据写入操作实现
写入逻辑遵循「从内层到外层」的顺序,先存嵌套的深层数据,再存外层数据,避免外键关联找不到实例的问题。
单条数据写入示例
from .models import Geo, Address, User, Post # 假设你已经把JSON字符串解析为Python字典,这里用示例数据演示 # 先处理用户数据 user_raw_data = { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } } } # 1. 先存最内层的geo数据 geo_data = user_raw_data['address'].pop('geo') geo = Geo.objects.create(**geo_data) # 2. 存地址数据,关联刚才创建的geo实例 address_data = user_raw_data.pop('address') address_data['geo'] = geo address = Address.objects.create(**address_data) # 3. 存用户数据,关联刚才创建的address实例 user_raw_data['address'] = address user = User.objects.create(**user_raw_data) # 再处理帖子数据 post_raw_data = { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" } # 关联对应用户,存入帖子 post_raw_data['user'] = User.objects.get(id=post_raw_data.pop('userId')) Post.objects.create(**post_raw_data)
批量数据写入优化
如果是大量数据写入,推荐先把所有内层实例批量创建后再统一处理外层,减少数据库IO次数:
- 先遍历所有用户数据,提取所有geo实例调用
bulk_create批量创建,拿到id后再批量创建address实例,再批量创建user实例 - 最后批量创建post实例,直接用已经存在的user_id做关联,不需要逐个查询用户
内容的提问来源于stack exchange,提问作者Alex137
相关产品推荐
相关产品推荐

