如何在MongoDB中创建指定JSON数据结构?基于Django+Djongo实现
Djongo实现MongoDB嵌套结构的正确方案
前置配置校验
确保Django项目settings.py中数据库配置的ENGINE字段已设置为djongo,且Djongo版本与当前Django版本兼容,推荐使用Djongo 1.3.6及以上版本。
模型定义步骤
1. 定义嵌入子模型
所有需要嵌套到其他文档的子模型,必须设置abstract = True的Meta属性,示例如下:
from djongo import models # 内层嵌入子模型 class SubDocument(models.Model): # 按需自定义子字段 sub_title = models.CharField(max_length=100) sub_count = models.IntegerField() sub_status = models.BooleanField(default=True) class Meta: abstract = True # 必加,标记为嵌入模型,不会生成独立集合
2. 定义主模型
根据结构需求,分别使用EmbeddedField存储单条嵌套文档,使用ArrayField嵌套EmbeddedField存储嵌套文档数组,示例如下:
class ParentDocument(models.Model): # 主文档基础字段 title = models.CharField(max_length=200) create_time = models.DateTimeField(auto_now_add=True) # 单条嵌套文档字段 single_sub = models.EmbeddedField( model_container=SubDocument, null=True, blank=True # 按需设置是否允许为空 ) # 嵌套文档数组字段 sub_list = models.ArrayField( model_container=SubDocument, null=True, blank=True ) # 基础类型数组字段(无需子模型) tag_list = models.ArrayField( models.CharField(max_length=50), default=list )
常见问题排查
- 不要混用Django原生PostgreSQL的
ArrayField,必须导入djongo.models.ArrayField - 嵌入子模型如果漏加
abstract = True会导致结构生成失败,Djongo会尝试为子模型创建独立集合 - 模型修改后必须执行
python manage.py makemigrations和python manage.py migrate同步结构 - 写入数据时,数组字段直接传入Python列表即可,嵌入字段直接传入子模型实例
数据写入示例
# 构造子文档实例 sub1 = SubDocument(sub_title="子项1", sub_count=10) sub2 = SubDocument(sub_title="子项2", sub_count=20) # 写入主文档 ParentDocument.objects.create( title="测试主文档", single_sub=sub1, sub_list=[sub1, sub2], tag_list=["测试", "MongoDB", "Djongo"] )
内容的提问来源于stack exchange,提问作者kedink
相关产品推荐
相关产品推荐

