django-autocomplete-light, использующий SQL Alchemy вместо Django ORM

Я хотел бы использовать django-autocomplete-light для автозаполнения некоторых полей из внешней базы данных, которые нельзя настроить в соответствии с требованиями DjangoORM. Поэтому я использую SQL Alchemy для подключения к этой БД.

Я не могу узнать, как это сделать. В качестве примера я хотел бы заставить автозаполнение использовать следующую таблицу вместо модели Django для таблицы (которая не работает, потому что есть первичный ключ с двумя столбцами и поле id).

query = (session.query(TableA.FIRSTNAME).distinct(TableA.FIRSTNAME)
                .filter(TableA.FIRSTNAME.match(name)))
data = query.limit(100).all()

По сути, я бы хотел, чтобы поле автоматически заполняло имена из моего запроса. Вместо использования Django qs, как показано в документации:

class CountryAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        # Don't forget to filter out results depending on the visitor !
        if not self.request.user.is_authenticated():
            return Country.objects.none()

        qs = Country.objects.all()

        if self.q:
            qs = qs.filter(name__istartswith=self.q)

        return qs

class PersonForm(forms.ModelForm):
    birth_country = forms.ModelChoiceField(
        queryset=Country.objects.all(),
        widget=autocomplete.ModelSelect2(url='country-autocomplete')
    )

1 ответ

Решение

Хорошо, я думаю, что мне удалось найти свое решение.

Я могу использовать Select2ListView, действующий на запрос SQL Alchemy, который возвращает список:

в views.py

from .forms import get_choice_list

class Select2ListViewAutocomplete(autocomplete.Select2ListView):
    def create(self, text):
        return text

    def get_list(self):
        return get_choice_list(name=self.q)

В Forms.py у меня есть следующее:

from dal import autocomplete

def get_choice_list(name=''):
    return dbc.extract_distinct_typecode(typeCode=name)

class SelectTypeForm(forms.Form):
    typeCode = autocomplete.Select2ListCreateChoiceField(choice_list=get_choice_list, widget=autocomplete.ListSelect2(url='typecode-autocomplete'))

где dbc.extract_distinct_typecode - это вызов функции, которая использует SQL Alchemy для извлечения списка кодов. Я ограничил длину списка кодов, чтобы скорость была хорошей.

и в urls.py у меня есть следующее:

urlpatterns = [
    url(r'^typecode-autocomplete/$', Select2ListViewAutocomplete.as_view(), name='typecode-autocomplete'),]

Вероятно, это хорошая идея, чтобы убедиться, что пользователь прошел аутентификацию, чтобы URL не возвращал результаты ни одному пользователю.

Другие вопросы по тегам