Django动态模型字段

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,如上所列,因为它不能很好地处理查询。


温温酱
浏览 845回答 3
3回答

慕桂英4014372

进一步的研究表明,这是实体属性值设计模式的一个特例,它已经通过几个包为Django实现。首先,有一个原始的eav-django项目,它位于PyPi上。其次,第一个项目django-eav是一个更新的分支,它主要是一个允许在第三方应用程序中使用django自己的模型或模型的EAV的重构。
打开App,查看更多内容
随时随地看视频慕课网APP