Django campos del modelo dinámico

Estoy trabajando en un multi-tenanted aplicación en la que algunos usuarios pueden definir sus propios campos de datos (a través del administrador) para recopilar datos adicionales en formularios e informar sobre los datos. El último bit hace que JSONField no sea una gran opción, por lo que tengo la siguiente solución:

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 cómo CustomDataField tiene una ForeignKey para el sitio: cada sitio tendrá un conjunto diferente de campos de datos personalizados, pero usará la misma base de datos. Luego, los diversos campos de datos concretos se pueden definir 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'),)

Esto lleva al siguiente 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?

Pero esto se siente muy torpe, particularmente con la necesidad de crear manualmente los datos relacionados y asociarlos con el modelo concreto. ¿Hay un mejor enfoque?

Opciones que se han descartado preventivamente:

SQL personalizado para modificar tablas sobre la marcha. En parte porque esto no escalará y en parte porque es demasiado pirateo. Soluciones sin esquema como NoSQL. No tengo nada en contra de ellos, pero todavía no encajan bien. Finalmente estos datose escrito, y existe la posibilidad de utilizar una aplicación de informes de terceros.JSONField, como se enumeró anteriormente, ya que no funcionará bien con las consultas.

Respuestas a la pregunta(3)

Su respuesta a la pregunta