You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:45:03