Потребовалось сделать для текущего проекта связанные селекты. По совету камрада Alerion глянул на smart_selects. Штука занятная, но больно ограниченная. Кстати, не понял, зачем они так глубоко закопали функционал, аж в модели засунули.
Я решил, что мне нужен функционал на уровне формы и отсутствие ограничений на фильтрацию выборок. За основу взял smart_selects. Функционал спрятан в виджет поля, что даёт свободу действий. Фильтрация выборок сделана на уровне метода модели, как его напишите, так и отфильтрует. Методов может быть много, по одному на каждый хитрый селект.

Пока код проходит стадию закрытого тестирования, покажу пример использования для затравки:
class ContractChoiceField(forms.ModelChoiceField):
u"""Класс для переопределения представления объектов в поле формы."""
def label_from_instance(self, obj):
return "%(project)s - %(contract)s" % {
'project': obj.project,
'contract': obj}
class EffortAddForm(forms.ModelForm):
u"""Форма заполнения трудозатрат."""
contract = ContractChoiceField(
label=_('Contract'),
queryset=Contract.objects.filter(
relation__mode=Step.STEP_TYPE_STAFF,
relation__duration_a__gt=0,
is_activated=True).distinct())
class Meta:
model = Effort
exclude = ('user', )
def __init__(self, *args, **kwargs):
super(EffortAddForm, self).__init__(*args, **kwargs)
if 0 == len(self.data):
# обнуляем выборку только при показе формы, в остальных случаях
# доступны все записи модели
self.fields['task'].queryset = Relation.objects.none()
self.fields['task'].widget = ChainedSelectWidget(
parent_name='contract',
app_name='contracts',
model_name='contract',
method_name='chained_relation', )
Всё остальное происходит автоматически.