Estoy tratando de implementar un filtrado personalizado en mi código y revisé la documentación. Pero no pude entender los siguientes fragmentos de los documentos.
class UserFilter(django_filters.FilterSet): class Meta: model = User fields = ['username', 'last_login'] # or class UserFilter(django_filters.FilterSet): class Meta: model = User fields = { 'username': ['exact', 'contains'], 'last_login': ['exact', 'year__gt'], }El documento dice que podemos usar el primero o el segundo, pero ¿cuál es la diferencia exacta? ¿Cuál es el significado de contiene y year_gt?
¿Cuál es la diferencia exacta?
Con fields = ['username', 'last_login'] , los filtros generados son:
qs.filter(username='some_value') y qs.filter(last_login=some_date_value)
Con
fields = { 'username': ['exact', 'contains'], 'last_login': ['exact', 'year__gt'], }los filtros generados son:
qs.filter(username='some_value') , qs.filter(username__contains='some_value') para el campo de nombre de username .
qs.filter(last_login=some_date_value) , qs.filter(last_login__year__gt=some_year_value) para el campo last_login .
Entonces, podemos ver a la primera que el segundo produce 2 opciones de filtro para cada campo, y el primero produce solo una opción de filtro ( exact match ) para el valor dado.
¿Cuál es el significado de contains y year__gt ?
contains se utiliza para filtrar por un valor que se puede encontrar dentro de un campo. ej: dj está en django .
year__gt por otro lado es solo para el campo de fecha. Cuando tiene un campo de fecha como created , Django le permite filtrar por year , month , day simplemente haciendo : .filter(created__year=2021, created__month=12) . Y más posibilidad por .filter(created__year__gt=2020) eso significa el año del campo creado> 2020 . Se puede aplicar a month__gt (mes > 11), day__lt (día < 25).
Hay un enlace en los documentos allí para los documentos de búsqueda de django también, y lo que encontrará con esto es que puede hacer que la búsqueda/filtrado sea más eficiente usando esa segunda opción.
La primera opción en los documentos, donde los fields son solo una lista, hará una consulta de coincidencia exacta con cada uno de los campos que enumere.
En la segunda opción, lo que hará la biblioteca de filtros con el diccionario de fields es usar la notación de "doble guión bajo" para crear búsquedas de;
username__exactusername__containslast_login__exactlast_login__year__gt Puede usar el guión bajo doble para acceder a un atributo de algo o al tipo de búsqueda. Entonces, en last_login para ese último ejemplo anterior, tomará el año del valor last_login y para ese año, el tipo de búsqueda es mayor que ( gt ).
Hay muchos de estos valores de búsqueda que pueden ser realmente útiles para aprender. Por ejemplo, contains distingue entre mayúsculas y minúsculas, pero puede usar icontains para una coincidencia que no distinga entre mayúsculas y minúsculas. También existe lt para menor que, o lte / gte para menor/mayor que o igual. Consulte las búsquedas disponibles aquí .