我正在研究多租户应用程序,其中一些用户可以定义他们自己的数据字段(通过管理员)来收集表单中的其他数据并报告数据。后者位使得JSONField不是一个很好的选择,所以不是我有以下解决方案:Django动态模型字段
class CustomDataField(models.Model):
"""
Abstract specification for arbitrary data fields.
Not used for holding data itself, but metadata about the fields.
"""
site = models.ForeignKey(Site, default=settings.SITE_ID)
name = models.CharField(max_length=64)
class Meta:
abstract = True
class CustomDataValue(models.Model):
"""
Abstract specification for arbitrary data.
"""
value = models.CharField(max_length=1024)
class Meta:
abstract = True
注CustomDataField如何有一个ForeignKey到网站 - 每个网站都会有一组不同的自定义数据字段的,但使用相同的数据库。 然后各种具体的数据字段可以被定义为:
class UserCustomDataField(CustomDataField):
pass
class UserCustomDataValue(CustomDataValue):
custom_field = models.ForeignKey(UserCustomDataField)
user = models.ForeignKey(User, related_name='custom_data')
class Meta:
unique_together=(('user','custom_field'),)
这导致以下用途:
custom_field = UserCustomDataField.objects.create(name='zodiac', site=my_site) #probably created in the admin
user = User.objects.create(username='foo')
user_sign = UserCustomDataValue(custom_field=custom_field, user=user, data='Libra')
user.custom_data.add(user_sign) #actually, what does this even do?
但这种感觉很笨重,尤其是需要手动创建相关数据和将其与具体模型相关联。有更好的方法吗?
选项已经先发制人地丢弃:
- 自定义SQL来修改即时表。部分原因是这不会扩展,部分是因为它太过分了。
- 无架构解决方案,如NoSQL。我对他们没有任何反应,但他们仍然不太合适。最终,该数据是键入的,并且存在使用第三方报告应用程序的可能性。
- JSONField,如上所列,因为它不会很好地处理查询。
先发制人,这不是任何一个问题: http://stackoverflow.com/questions/7801729/django-model-with-dynamic-attributes http://stackoverflow.com/questions/ 2854656/per-instance-dynamic-fields-django-model – GDorn