【问题标题】:python django-autocomplete-light UnorderedObjectListWarningpython django-autocomplete-light UnorderedObjectListWarning
【发布时间】:2018-09-20 17:57:14
【问题描述】:

我最近一直在使用 Django 做网站,在实现链式下拉/依赖下拉时遇到了困难。我尝试了 smart-selects 但无法实现它,那是我偶然发现 django-autocomplete-light 的时候。

我能够实现这个并且它符合我当前的要求,但是,我注意到 python 正在抛出这个警告:

UnorderedObjectListWarning: Pagination may yield inconsistent results
with an unordered object_list: <class 'project.models.Driver'> QuerySet.

我彻底遵循了 django-autocomplete-light 中的教程,但我仍然缺少一些东西。

forms.py

class TripModelForm(forms.ModelForm):

    driver = forms.ModelChoiceField(
        queryset=Driver.objects.all(),
        widget=autocomplete.ModelSelect2(url='driver_autocomplete',
                                         forward=['hauler'])
    )

    class Meta:
        model = Trip
        fields = ['ticket', 'date_issued', 'department', 'hauler', 'plate_number', 'driver',]

urls.py

urlpatterns += [
    path('driver-autocomplete/', views.DriverAutocomplete.as_view(), name='driver_autocomplete'),
]

views.py

class DriverAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):

        if not self.request.user.is_authenticated():
            return Driver.objects.none()

        qs = Driver.objects.all()
        hauler = self.forwarded.get('hauler', None)

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

        return qs

【问题讨论】:

    标签: django django-autocomplete-light


    【解决方案1】:

    我跟踪了错误的来源,它位于 \python36\lib\site-packages\django\views\generic\list.py:88 中。看起来该类需要有序查询集,因此我已将 views.py 修改为:

    views.py

    class DriverAutocomplete(autocomplete.Select2QuerySetView):
        def get_queryset(self):
    
            if not self.request.user.is_authenticated():
            return Driver.objects.none()
    
            qs = Driver.objects.all().order_by('name') <-- here
            if self.q:
            hauler = self.forwarded.get('hauler', None)
    
            if hauler:
                qs = qs.filter(hauler=hauler)
            if self.q:
                qs = qs.filter(name__istartswith=self.q)
    
            return qs
    

    这个解决方案对我有用,我可以通过删除查询中的 .order_by 来复制警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-17
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2013-01-06
      • 2016-10-12
      • 1970-01-01
      相关资源
      最近更新 更多