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

如何为Django不同公司的用户模型添加可编辑自定义字段?

解决方案

一、数据库表结构设计

采用字段模板+用户值存储的方案,既支持不同公司的字段差异化配置,又能实现每个用户的独立编辑:

1. 公司表(companies)

存储公司核心信息,作为字段模板和用户的关联核心:

字段名类型说明
idINT(11)主键,自增
company_nameVARCHAR(50)公司名称(如EXAMPLE、VIN)

2. 用户表(users)

存储所有用户共有的必填字段:

字段名类型说明
idINT(11)主键,自增
nameVARCHAR(100)用户姓名(必填)
company_idINT(11)外键,关联companies.id

3. 公司字段模板表(company_field_templates)

定义每个公司专属的自定义字段规则,避免字段混乱:

字段名类型说明
idINT(11)主键,自增
company_idINT(11)外键,关联companies.id
field_nameVARCHAR(50)自定义字段名(如AGE、SIZE)
field_typeVARCHAR(20)字段类型(如INT、VARCHAR)
is_requiredTINYINT(1)是否必填(0/1)

4. 用户自定义字段值表(user_custom_fields)

存储每个用户的自定义字段实际值,实现用户级别的独立编辑:

字段名类型说明
idINT(11)主键,自增
user_idINT(11)外键,关联users.id
field_idINT(11)外键,关联company_field_templates.id
field_valueTEXT字段实际值(兼容多种类型)

二、字段配置与用户数据操作

1. 配置公司专属字段

给EXAMPLE公司添加AGE字段:

INSERT INTO company_field_templates (company_id, field_name, field_type, is_required)
VALUES (
    (SELECT id FROM companies WHERE company_name = 'EXAMPLE'),
    'AGE',
    'INT',
    1
);

给VIN公司添加SIZE、AGE、WORK字段:

INSERT INTO company_field_templates (company_id, field_name, field_type, is_required)
VALUES
((SELECT id FROM companies WHERE company_name = 'VIN'), 'SIZE', 'VARCHAR(20)', 1),
((SELECT id FROM companies WHERE company_name = 'VIN'), 'AGE', 'INT', 1),
((SELECT id FROM companies WHERE company_name = 'VIN'), 'WORK', 'VARCHAR(100)', 0);

2. 添加用户及自定义字段值

新增EXAMPLE公司的用户时,同步插入AGE字段值:

-- 插入基础用户信息
INSERT INTO users (name, company_id)
VALUES ('张三', (SELECT id FROM companies WHERE company_name = 'EXAMPLE'));
-- 获取新用户ID
SET @user_id = 1471706;
-- 插入AGE字段值
INSERT INTO user_custom_fields (user_id, field_id, field_value)
VALUES (
    @user_id,
    (SELECT id FROM company_field_templates WHERE company_id = (SELECT id FROM companies WHERE company_name = 'EXAMPLE') AND field_name = 'AGE'),
    '25'
);

3. 更新用户自定义字段值

修改VIN公司某用户的WORK字段:

UPDATE user_custom_fields
SET field_value = '产品经理'
WHERE user_id = 123
AND field_id = (
    SELECT id FROM company_field_templates
    WHERE company_id = (SELECT id FROM companies WHERE company_name = 'VIN')
    AND field_name = 'WORK'
);

三、查询完整用户信息

获取单个用户的所有字段(基础+自定义):

SELECT
    u.name,
    cft.field_name,
    ucf.field_value
FROM users u
LEFT JOIN company_field_templates cft ON u.company_id = cft.company_id
LEFT JOIN user_custom_fields ucf ON u.id = ucf.user_id AND cft.id = ucf.field_id
WHERE u.id = 123;

如果需要把自定义字段拼接成JSON格式:

SELECT
    u.name,
    JSON_OBJECTAGG(cft.field_name, ucf.field_value) AS custom_fields
FROM users u
LEFT JOIN company_field_templates cft ON u.company_id = cft.company_id
LEFT JOIN user_custom_fields ucf ON u.id = ucf.user_id AND cft.id = ucf.field_id
WHERE u.id = 123
GROUP BY u.id;

内容的提问来源于stack exchange,提问作者Віталій Грицулевич

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:15:55