python django-autocomplete-light UnorderedObjectListWarning
python django-autocomplete-light UnorderedObjectListWarning
我最近一直在使用 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
我跟踪了 \python36\lib\site-packages\django\views\generic\list.py:88 中错误的来源。看起来 class 需要有序的查询集,所以我将 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 来复制警告。
我最近一直在使用 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
我跟踪了 \python36\lib\site-packages\django\views\generic\list.py:88 中错误的来源。看起来 class 需要有序的查询集,所以我将 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 来复制警告。