So verwendet Ich habe in ihm den Code aus WeizhongTu Antwort und fand einen nicht so offensichtlichen Fehler. Wenn wir versuchen, beide Filterung zu verwenden und mit diesem Code suchen, ist das Filtern von dieser Linie beschattet:
queryset = self.model.objects.filter(eval(query_condition))
Es ist wichtig, nur die bisherigen Ergebnisse zu verwenden. Sie dürfen also nie self.model.objects
verwenden, um das Abfrage-Set zu erhalten, sondern nur das Abfrage-Set selbst filtern. Wie folgt:
def get_search_results(self, request, queryset, search_term):
# search_term is what you input in admin site
# queryset is the list of objects passed to you
# by the previous functions, e. g. filtering
search_term_list = search_term.split(' ') #['apple','bar']
search_columns = ('name','age','address')
# convert to Q(name='apple') | Q(name='bar') | Q(age='apple') | ...
query_condition = ' | '.join(['Q(%s="%s")'%(x,y) for x in search_term_list for y in search_columns])
appended_queryset = queryset.filter(eval(query_condition))
# queryset is search results
queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
queryset |= appended_queryset
return queryset, use_distinct
Bitte erläutern Sie, welches Verhalten genau Sie erreichen möchten. Idealerweise ein Beispiel geben. –
Ich habe gerade ein Beispiel hinzugefügt –
Ich aktualisierte meine Antwort, Sie können es lesen und bearbeiten, dann versuchen Sie es – WeizhongTu