Paquet de filtres Django - Part 2 - Els estudiants de codi

Bloc

Paquet de filtres Django - Part 2 - Els estudiants de codi

A la part 2 de la nostra publicació sobre Django Filter, aprofundirem i aprendrem com podem crear un mètode de filtre personalitzat i afegir atributs al formulari.

Per ser persistents en el nostre enfocament, prendrem el mateix exemple part 1 de Django Filters .

Filtra el conjunt de consultes mitjançant un mètode personalitzat

Suposem que volem mostrar autors que han escrit més d’un determinat nombre de llibres i també mostrar el recompte de llibres escrits per cada autor.

Per a això, hem d’especificar un mètode personalitzat que prengui queryset i paràmetres i retorni el queryset filtrat de llibres l’autor dels quals ha escrit un determinat nombre de llibres.

Ho podem fer de la mateixa manera que es mostra la part anterior pel recompte de llibres que no forma part de cap model, per tant hem de passar method l'argument per filtrar.

A l'exemple següent, hem especificat el mètode method='author_books_count' per filtrar el camp author_books.

El mètode author_books_count agafa 4 arguments self, queryset, name, value. Tots els camps són obligatoris.

  • jo mateix : fa referència a aquesta mateixa classe de filtres.
  • queryset : aquest argument té l'objecte queryset que actualment s'utilitza per filtrar. Només hem de modificar aquest conjunt de consultes i tornar.
  • nom : té el nom del camp de filtre en aquest cas author_books.
  • valor `: això ha filtrat el valor d'aquest camp en particular.

En app (filter_and_pagination) /filter.py dossier.

import django_filters from filter_and_pagination.models import Book,Author from django import forms class BookFilterExp3(django_filters.FilterSet): book_name = django_filters.CharFilter(lookup_expr='iexact') author_name = django_filters.CharFilter(label='Author Name',field_name='author__author_name', lookup_expr='icontains') author_books = django_filters.NumberFilter(label='Number of Books Published By Author',method='author_books_count') class Meta: model = Book fields = ['status'] def author_books_count(self, queryset, name, value): authors_qs = Author.objects.all() authors_id = [] for author in authors_qs: count = Book.objects.filter(author=author).count() if count >= value: authors_id.append(author.id) qs = Book.objects.filter(author__in=authors_id) return qs

Ara, fem una visualització i l’afegim a urls.py dossier.

def filter_example_3(request): books = BookFilterExp3(request.GET) ctx={ 'books' : books } path='filter_and_pagination/filter_listing.html' return render(request,path,ctx) urlpatterns = [ ... path('filter_example_3', views.filter_example_3, name='filter_example_3'), ]

#django framework #python #django #learn python

thecodelearners.com

Paquet de filtres Django - Part 2 - Els estudiants de codi

A la part 2 de la nostra publicació sobre Django Filter, aprofundirem i aprendrem com podem crear un mètode de filtre personalitzat i afegir atributs al formulari. Per ser persistents en el nostre enfocament, prendrem el mateix exemple de la primera part de Django Filters.