如何为Django不同公司的用户模型添加可编辑自定义字段?
解决方案
一、数据库表结构设计
采用字段模板+用户值存储的方案,既支持不同公司的字段差异化配置,又能实现每个用户的独立编辑:
1. 公司表(companies)
存储公司核心信息,作为字段模板和用户的关联核心:
| 字段名 | 类型 | 说明 |
|---|---|---|
id | INT(11) | 主键,自增 |
company_name | VARCHAR(50) | 公司名称(如EXAMPLE、VIN) |
2. 用户表(users)
存储所有用户共有的必填字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
id | INT(11) | 主键,自增 |
name | VARCHAR(100) | 用户姓名(必填) |
company_id | INT(11) | 外键,关联companies.id |
3. 公司字段模板表(company_field_templates)
定义每个公司专属的自定义字段规则,避免字段混乱:
| 字段名 | 类型 | 说明 |
|---|---|---|
id | INT(11) | 主键,自增 |
company_id | INT(11) | 外键,关联companies.id |
field_name | VARCHAR(50) | 自定义字段名(如AGE、SIZE) |
field_type | VARCHAR(20) | 字段类型(如INT、VARCHAR) |
is_required | TINYINT(1) | 是否必填(0/1) |
4. 用户自定义字段值表(user_custom_fields)
存储每个用户的自定义字段实际值,实现用户级别的独立编辑:
| 字段名 | 类型 | 说明 |
|---|---|---|
id | INT(11) | 主键,自增 |
user_id | INT(11) | 外键,关联users.id |
field_id | INT(11) | 外键,关联company_field_templates.id |
field_value | TEXT | 字段实际值(兼容多种类型) |
二、字段配置与用户数据操作
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,提问作者Віталій Грицулевич
相关产品推荐
相关产品推荐

