好的,我正在开发一个Django应用程序,它有几个不同的模型,即Accounts,Contacts等,每个模型都有一组不同的字段。除了现有字段之外,我还需要允许每个用户定义自己的字段。我已经看到了几种不同的方法来实现这一点,从拥有大量的CustomFields,只是将自定义名称映射到每个用户使用的每个字段。我似乎也建议实现用户定义字段的复杂映射或XML / JSON样式存储/检索。
所以我的问题是,有没有人在Django应用程序中实现用户定义的字段?如果是这样,你是怎么做到的,你对整体实施的经验(稳定性,性能等)是什么?
更新:我的目标是允许我的每个用户创建n个每种记录类型(帐户,联系人等),并将用户定义的数据与每条记录相关联。例如,我的一个用户可能想要将SSN与他的每个联系人相关联,因此我需要为他创建的每个联系人记录存储该附加字段。
谢谢!
标记
答案 0 :(得分:3)
如果您使用ForeignKey会怎样?
此代码(未经测试且用于演示)假设存在系统范围的自定义字段集。要使其特定于用户,您需要在CustomField类中添加“user = models.ForiegnKey(User)”。
class Account(models.Model):
name = models.CharField(max_length=75)
# ...
def get_custom_fields(self):
return CustomField.objects.filter(content_type=ContentType.objects.get_for_model(Account))
custom_fields = property(get_fields)
class CustomField(models.Model):
"""
A field abstract -- it describe what the field is. There are one of these
for each custom field the user configures.
"""
name = models.CharField(max_length=75)
content_type = models.ForeignKey(ContentType)
class CustomFieldValueManager(models.Manager):
get_value_for_model_instance(self, model):
content_type = ContentType.objects.get_for_model(model)
return self.filter(model__content_type=content_type, model__object_id=model.pk)
class CustomFieldValue(models.Model):
"""
A field instance -- contains the actual data. There are many of these, for
each value that corresponds to a CustomField for a given model.
"""
field = models.ForeignKey(CustomField, related_name='instance')
value = models.CharField(max_length=255)
model = models.GenericForeignKey()
objects = CustomFieldValueManager()
# If you wanted to enumerate the custom fields and their values, it would look
# look like so:
account = Account.objects.get(pk=1)
for field in account.custom_fields:
print field.name, field.instance.objects.get_value_for_model_instance(account)