Uso del tipo de frecuencia del día 26 y filtrado de clasificación

Uso del tipo de frecuencia del día 26

Orden de búsqueda de información de configuración

  • Configuración parcial (prioridad) La configuración parcial tiene prioridad sobre la configuración parcial
  • Configuración global (segunda prioridad) Configuración global sin configuración predeterminada
  • Configuración predeterminada (última) Si no hay una configuración global, vaya a la configuración predeterminada

Uno, el uso del campo de elección en la tabla.

Choice recibe una tupla (se garantiza que el valor es inmutable) y, de manera similar, cada opción también se compone de una tupla ** (valor, display_name) **. Obviamente, display_name se mostrará en la página.

class Book(models.Model):
    name = models.CharField(max_length=32)
    author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
    category = models.CharField(max_length=32, choices=(('1', '历史'), ('2', '政治'), ('3', '语文')))

imagen-20201111152513734

De forma predeterminada, nuestro campo de categoría solo mostrará el primer tipo en la tupla, que es la cadena 1, 2, 3

 {
    
    
        "id": 1,
        "name": "python",
        "category": "1",
        "author": 1
    },

Si queremos obtener el valor correspondiente "Historia", "Política", "Idioma"Espera ... lo usaremos para nosotrosGenerado automáticamente(¡Puede usarlo directamente después de migrar la base de datos!) get_category_display

imagen-20201111154550310

Entonces podemos usar este método en el serializador.

class BookSerializer(serializers.ModelSerializer):
    category = serializers.CharField(source='get_category_display')
    
    class Meta:
        model = models.Book
        fields = "__all__"
        depth = 1

    {
    
    
        "id": 1,
        "category": "历史",
        "name": "python",
        "author": {
    
    
            "id": 1,
            "name": "李二狗",
            "address": "南湖大道"
        }
    },

Dos, el uso de múltiples vistas

En tercer lugar, el uso de la frecuencia

1. Frecuencia personalizada

2. Uso de clasificación incorporada

2.1.1 Uso parcial

Agregue el atributo throttle_class a la clase de vista

throttle_classes = [auth.MyThrottle,]

2.1.2 Uso global

Configure REST_FRAMEWORD = {} en la configuración y agregue pares clave-valor de calificación predeterminada

REST_FRAMEWORK = {
    
    
    	'DEFAULT_THROTTLE_CLASSES':['app01.MyThrottle.MyThrottle',],
		}

2.2 Amplíe la clase de frecuencia incorporada

  • BaseThrottle: 基 类
  • SimpleRateThrottle: vamos a personalizarlo y expandirlo
  • AnonRateThrottle: Limita el número de visitas de usuarios anónimos, distingue a los usuarios por dirección IP
  • ScopedRateThrottle: Limita la frecuencia de acceso a cada vista, distinguida por dirección IP o ID de usuario
  • UserRateThrottle: Limite el número de visitas de usuarios registrados

Los últimos tres son sus restricciones de frecuencia de acceso incorporadas, y el frente es para expandirnos.

2.3 Amplíe la clase de frecuencia incorporada

from rest_framework.throttling import SimpleRateThrottle


class MyThrottle(SimpleRateThrottle):
    scope = '外比巴卜'
    
    def get_cache_key(self, request, view):
        
        return self.get_ident(request)  # 通过id限制

Luego configuramos en el escenario

REST_FRAMEWORK = {
    
    
    'DEFAULT_THROTTLE_CLASSES': ['app01.MyThrottle.MyThrottle', ],
    
    'DEFAULT_THROTTLE_RATES': {
    
    '外比巴卜': '5/m'}  # key 与我们之前定义scope对应 value 是 次数/天/分/秒
}

imagen-20201111162402993

2.4 Leer el código fuente

imagen-20201111171920359

Cinco funciones de filtrado de terceros integradas (segundo enfoque)

1. Filtro

Filtrar los datos de la lista según el campo

Uso de filtros integrados

  • Configurar en la clase de vista

    class BookView(GenericAPIView, ListModelMixin):
        queryset = Book.objects
        serializer_class = BookSerializer
        filter_backends = [SearchFilter]
        search_fields = ('name','id')  # 模型表中存在的字段
        
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    

    Proceso de ejecución—> clase SearchFilter—> get_search_fields—> must_call_distinct

    Método de consulta

    El método heredado por defecto esConsulta difusa, ¡Se consultará cualquier contenido relacionado!

    http://127.0.0.1:8000/books/?search=1

    imagen-20201111190649135

Función de filtrado ampliado de terceros

pip install django-filter

La última versión django-filterse debe mantener django2.2arriba, si no, se djangoinstalará la versión predeterminada a la última

Necesitamos encontrarnos a sí mismos a cambio de su django-filterliberación

class BookView(GenericViewSet, ListModelMixin, CreateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend, ]
    filter_fields = ('name', 'id')  # 这里的字段不一样了 以前是search_fields
    
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

La búsqueda también es fácil

127.0.0.1:8000/book/?name=雪山飞狐&id=3

imagen-20201111195007187

ÉsteModo no difuso, No se puede encontrar la palabra clave.

Seis, función de clasificación

1. Configurar en la clase de vista

filter_backends =[OrderingFilter,]  # 可以混合使用
ordering_fields=['id','age']  # 先按照id 再按照年龄排序

Instrucciones

127.0.0.1:8000/book/?ordering=-id

imagen-20201111195714377

2. Ordenar después de filtrar

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter


class BookView(GenericViewSet, ListModelMixin, CreateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend, OrderingFilter]  # 混合使用
    filter_fields = ('name', 'id')
    ordering_field = ('id', 'category')
    
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

utilizar

127.0.0.1:8000/book/?name=雪山飞狐&ordering=-id

imagen-20201111200059773

Supongo que te gusta

Origin blog.csdn.net/A1L__/article/details/109630088
Recomendado
Clasificación