Ответ, предоставленный Энтони в комментарии, в итоге сработал.
Изменение модели на приведенную ниже работает для функции индекса.Мне нужно было IS_NULL_OR в моем случае использования, чтобы позволить значение также отсутствует.
db.define_table('cat',
Field('name', type='string', label='Name'),
Field('parent', 'reference cat', label='Parent'),
format='%(name)s',
)
db.cat.parent.requires = IS_NULL_OR(IS_IN_DB(db, 'cat.id', '%(name)s'))
Как указал Энтони, атрибут представления также необходим для отображения правильного значения в SQLFORM.grid; приведенная выше модель приводит к отображению переменной id в функции управления.
В функции управления я добавил представление в родительское поле, которое может быть буквальным словом none, если оно пустое, или поиском.
def manage():
db.cat.parent.represent = lambda id, r: db.cat[id].name if id else 'None'
form=SQLFORM.grid(db.cat,
user_signature=False)
return locals()