Django動態模型字段我正在開發一個多租戶應用程序,其中一些用戶可以定義自己的數據字段(通過管理員)以收集表單中的其他數據并報告數據。后一位使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 = Trueclass CustomDataValue(models.Model):
"""
Abstract specification for arbitrary data.
"""
value = models.CharField(max_length=1024)
class Meta:
abstract = True請注意CustomDataField如何具有ForeignKey to Site - 每個站點將具有一組不同的自定義數據字段,但使用相同的數據庫。然后,各種具體數據字段可以定義為:class UserCustomDataField(CustomDataField):
passclass 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 adminuser = 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,如上所列,因為它不能很好地處理查詢。
3 回答

慕桂英4014372
TA貢獻1871條經驗 獲得超13個贊
進一步的研究表明,這是實體屬性值設計模式的一個特例,它已經通過幾個包為Django實現。
首先,有一個原始的eav-django項目,它位于PyPi上。
其次,第一個項目django-eav是一個更新的分支,它主要是一個允許在第三方應用程序中使用django自己的模型或模型的EAV的重構。
添加回答
舉報
0/150
提交
取消