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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:18:19