Django中如何将含动态自定义字段的API数据存入单模型表?
解决方案:将含动态自定义字段的API数据存入单个Django模型
1. 调整Lead模型结构
无需创建单独的自定义字段模型,直接在主Lead模型中添加JSONField来存储所有动态自定义字段,同时保留API返回的固定字段:
from django.db import models class Lead(models.Model): # 映射API返回的固定字段 external_id = models.BigIntegerField(unique=True) # 对应API的"id" name = models.CharField(max_length=255) price = models.DecimalField(max_digits=10, decimal_places=2) responsible_user_id = models.BigIntegerField() # 用JSONField存储动态自定义字段,默认空字典 custom_fields = models.JSONField(default=dict) def __str__(self): return self.name
2. 数据转换与保存逻辑
将API返回的custom_fields_values转换成键值对格式(以字段名为键、字段值为值),再存入模型的custom_fields字段:
def process_and_save_lead(api_data): # 提取固定字段数据 base_payload = { 'external_id': api_data['id'], 'name': api_data['name'], 'price': api_data['price'], 'responsible_user_id': api_data['responsible_user_id'], } # 处理动态自定义字段,转换为易读的键值对 custom_fields_map = {} for field_item in api_data.get('custom_fields_values', []): # 根据字段类型处理值,示例处理select类型 if field_item['field_type'] == 'select' and field_item['values']: field_value = field_item['values'][0]['value'] else: # 其他类型(如文本、数值)可按需扩展处理逻辑 field_value = field_item['values'][0]['value'] if field_item['values'] else None custom_fields_map[field_item['field_name']] = field_value # 实例化并保存Lead对象 lead = Lead(**base_payload) lead.custom_fields = custom_fields_map lead.save() return lead
3. 额外说明
- 若部分自定义字段属于高频查询字段,可单独为其添加模型字段(如
gender = models.CharField(max_length=20, null=True)),在数据处理时单独提取赋值,剩余低频动态字段仍存入JSONField。 - 支持基于
JSONField的查询,例如筛选性别为Male的线索:Lead.objects.filter(custom_fields__Gender='Male') - 注意字段类型兼容性,确保API返回值与模型字段类型匹配(如API的
price为整数,存入DecimalField时需转换)。
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

