Если я правильно понимаю ваше затруднительное положение, сама проблема заключается в том, как вы решаете, какие категории могут быть родителями, а какие нет. Один из способов избежать этих проблем - фактически ограничить уровень категорий, которые могут стать родителями. Например, допустим, у вас есть следующие категории:
Обычно я справляюсь с этим так: у меня очевидно есть FK parent_id в таблице категорий. Для корневых элементов (Internet, Offline) parent_id будет равен 0. Итак, когда, по вашему мнению, вы пытаетесь получить «родительские категории» для выпадающего списка, вам необходимо решить, насколько далеко они могут продолжать вложение. Я в основном ограничиваюсь этим уровнем до первого уровня, поэтому, чтобы выбрать, какие категории показывать в раскрывающемся списке, вы должны сделать что-то вроде:
parents = Category.objects.filter(parent_id=0)
Теперь, очевидно, это несколько ограничивает подход, но вы можете увеличить уровень, который вы хотели бы включить, и разработать какую-то систему визуальной идентификации в вашем шаблоне для раскрывающегося списка (включая дополнительные пробелы или тире для каждого уровня в иерархия или что-то).
В любом случае, извините за длинный ответ, и, надеюсь, это несколько решило вашу проблему.