您可以以序列化状态存储其他数据。这可以为您节省一些数据库命中并稍微简化您的数据库结构。如果您打算仅将数据用于显示目的,这可能是最佳选择。
示例实现(未测试)::
import yaml
from django.db import models
class UserProfile(models.Model):
user = models.OneToOneField('auth.User', related_name='profile')
_additional_info = models.TextField(default="", blank=True)
@property
def additional_info(self):
return yaml.load(self._additional_info)
@additional_info.setter
def additional_info(self, user_info_dict):
self._additional_info = yaml.dump(user_info_dict)
当您分配给profile.additional_info 时,比如说,一个字典,它会被序列化并存储在_additional_info 中(不要忘记稍后保存实例)。然后,当你访问additional_info 时,你会得到那个 python 字典。
我猜,你也可以写一个自定义字段来处理这个。
更新(根据您的评论):
因此,这里的实际问题似乎是如何为用户配置文件自动创建和验证表单。 (不管你是使用序列化选项还是复杂的数据结构,它仍然存在。)
既然您可以轻松创建动态表单[1],那么主要问题是如何验证它们。
考虑一下...管理员无论如何都必须为每个自定义字段指定验证器(或字段类型),对吧?所以你需要某种配置选项——比如,
CUSTOM_PROFILE_FIELDS = (
{
'name': 'user_ip',
'validators': ['django.core.validators.validate_ipv4_address'],
},
)
然后,当您初始化表单时,您可以根据此设置定义字段及其验证器。
[1] 另请参阅 Jacob Kaplan-Moss 关于动态表单生成的 this post。不过,它不处理验证。