django-autocomplete-light使用SQL Alchemy而不是Django ORM

时间:2016-11-17 17:01:04

标签: python django autocomplete django-forms django-autocomplete-light

我想使用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 个答案:

答案 0 :(得分: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'),]

确保用户通过身份验证可能是一个好主意,这样网址就不会将结果返回给任何用户。