title: How to store arbitrary name/value key pairs in a Django model?
body: <p>I have a fixed data model that has a lot of data fields.</p>
  
  <pre>
  class Widget(Models.model):
      widget_owner = models.ForeignKey(auth.User)
      val1 = models.CharField()
      val2 = models.CharField()
      ...
      val568 = ...
  </pre>
  
  <p>I want to cram even more data into this Widget by letting my users specify custom data fields.  What's a sane way to do this?  Is storing name/value pairs where the user can specify additional "Widget fields" a good idea?  My pseudo thoughts are below:</p>
  
  <pre>
  data_types = ('free_text', 'date', 'integer', 'price')
  class CustomWidgetField(models.Model)
    owner = ForeignKey(auth.User)
    field_title = models.CharField(auth.User)
    field_value_type = models.CharField(choices = data_types)
  
  class CustomWidgetValue(models.Model)
    field_type = ForeignKey(CustomWidgetField)
    widget = ForeignKey(Widget)
    value = models.TextField()
  </pre>
  
  <p>So I want to let each user build a new type of data field that will apply to all of their widgets and then specify values for each custom field in each widget.  I will probably have to do filtering/searching on these custom fields just as I would on a native field (which I assume will be much slower than operating on native fields.)  But the scale is to have a few dozen custom fields per Widget and each User will only have a few thousand Widgets in their inventory.  I can also probably batch most of the searching/filtering on the custom fields into a backend script (maybe.)</p>