Посмотрите на
django-hstore (при условии, что вы можете использовать PostgreSQL). Это поле, в котором можно хранить произвольное число пар ключ - значение. Таким образом, общие для всех видов товаров поля вы храните как обычные поля модели, а меняющиеся поля пакуете в hstore. По этим запакованным полям можно даже делать поиск, за счёт того, что HStore - это родной для PostgreSQL тип данных.
Ещё вы можете использовать тип JSON, тоже специфический для PostgreSQL. Отличается от hstore тем, что структура поля может быть древовидной и значения - типизированными (собственно, что и предполагает JSON). Пакетов, которые поддерживают это поле в Django, существует несколько, можно погуглить.
Также вариантом является упомянутый EAV, но лично мне очень не нравится этот подход. Отсутствие контроля типов, крайне низкая скорость на больших объёмах и общая уродливость решения. SQL-база данных создана не для того, чтоб её как key-value использовать. Лучше уж немного расширить её возможности костылями типа hstore.