Django dynamic model fields

Estou trabalhando em um multi-inquilino aplicativo no qual alguns usuários podem definir seus próprios campos de dados (por meio do administrador) para coletar dados adicionais em formulários e reportar os dados. O último bit torna o JSONField não uma ótima opção, então, em vez disso, tenho a seguinte solução:

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

Observe como o CustomDataField possui uma ForeignKey no site - cada site terá um conjunto diferente de campos de dados personalizados, mas usará o mesmo banco de dados. Em seguida, os vários campos de dados concretos podem ser definidos como:

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'),)

Isso leva ao seguinte uso:

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?

Mas isso parece muito desajeitado, principalmente com a necessidade de criar manualmente os dados relacionados e associá-los ao modelo concreto. Existe uma abordagem melhor

Opções que foram descartadas preventivamente:

SQL personalizado para modificar tabelas on-the-fly. Em parte porque isso não será dimensionado e em parte porque é muito complicad Soluções sem esquema, como NoSQL. Não tenho nada contra eles, mas eles ainda não se encaixam. Por fim, esses dados digitado e existe a possibilidade de usar um aplicativo de relatório de terceiroJSONField, conforme listado acima, pois não vai funcionar bem com consulta

questionAnswers(3)

yourAnswerToTheQuestion