最佳答案
我正在开发一个 多租户应用程序,其中一些用户可以定义自己的数据字段(通过管理员) ,以收集表单中的其他数据并报告这些数据。后一点使得 JSONField 不是一个很好的选择,因此我有以下解决方案:
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 to Site-每个 Site 将有一组不同的自定义数据字段,但使用相同的数据库。 然后可以将各种具体数据字段定义为:
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?
但是这感觉非常笨重,特别是需要手动创建相关数据并将其与具体模型关联。还有更好的办法吗?
已被先发制人地放弃的选择: