如何用Python将单个Django Fixture JSON拆分为两个JSON文件?
用Python拆分Django Fixture JSON数据
完全可以用Python的json库来实现这个拆分需求,比直接做字符串处理更可靠——毕竟JSON存在嵌套结构,字符串操作很容易出错。
下面是具体的实现步骤和代码示例:
- 定义字段规则:先明确哪些字段属于
music模型,哪些属于meta模型。假设你的多语言名称字段是name_zh、name_en这类,元数据字段是release_date、genre、duration等(可根据实际字段名调整)。 - 读取原始Fixture:把JSON文件加载成Python字典列表。
- 拆分数据:遍历每个条目,分别生成
music和meta模型的Fixture数据。 - 写入新文件:把拆分后的数据分别写入两个JSON文件。
示例代码:
import json # 读取原始fixture文件 with open('original_music_fixture.json', 'r', encoding='utf-8') as f: original_data = json.load(f) # 定义字段拆分规则 music_fields = ['creator', 'key', 'name_zh', 'name_en'] # 替换成你的多语言名称字段 meta_model_name = 'meta' music_fixture = [] meta_fixture = [] for item in original_data: # 处理music模型的fixture music_item = { 'model': item['model'], 'pk': item['pk'], 'fields': {k: v for k, v in item['fields'].items() if k in music_fields} } music_fixture.append(music_item) # 处理meta模型的fixture meta_fields = {k: v for k, v in item['fields'].items() if k not in music_fields} if meta_fields: meta_item = { 'model': meta_model_name, 'pk': item['pk'], 'fields': meta_fields } meta_fixture.append(meta_item) # 写入拆分后的fixture文件 with open('music_fixture.json', 'w', encoding='utf-8') as f: json.dump(music_fixture, f, ensure_ascii=False, indent=2) with open('meta_fixture.json', 'w', encoding='utf-8') as f: json.dump(meta_fixture, f, ensure_ascii=False, indent=2)
注意事项
- 如果你有多语言名称字段的统一命名规则(比如以
name_开头),可以用字符串匹配批量获取字段:[k for k in item['fields'] if k.startswith('name_')],不用逐个枚举。 - 要确保
meta模型的字段和拆分出来的字段完全对应,否则导入Fixture时会报错。 - 原始数据中有嵌套字段也能正常处理,
json库会自动保留字典结构。
内容的提问来源于stack exchange,提问作者H C
相关产品推荐
相关产品推荐

