es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Buscar campos en el método de acción personalizado.

Ahora estoy estudiando DRF y tengo que hacer un proyecto con álbumes de fotos. Una de mis tareas es crear un método personalizado “@action” de tipo “patch”, utilizando el campo de modelo “title”, pero no entiendo cómo agregar campos para búsqueda en métodos personalizados. Podemos verlos en los métodos base, como “get”, “patch” y “put”, pero no puedo encontrar ninguna información sobre cómo agregarlos a acciones personalizadas.

Si alguien sabe cómo hacerlo, por favor, dígamelo.

Mi modelo:

class PhotoAlbum(models.Model):
    title = models.CharField(verbose_name='Título del álbum', max_length=50, null=True)
    created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, verbose_name='Autor')
    created_at = models.DateTimeField(verbose_name='Fecha de creación', editable=False,
                                      default=datetime.datetime.today())

    class Meta:
        verbose_name = 'Álbum de fotos'
        verbose_name_plural = 'Álbumes de fotos'

    def __str__(self):
        return f'{self.title} Autor: {self.created_by} Fecha: {self.created_at}'

Mi vista:

def photo_album_view(request):
    photo_albums = PhotoAlbum.objects.all()
    context = {
        'photo_albums': photo_albums,
    }

    return render(request, 'photo_album.html', context=context)

Mi viewset:

class AlbumFilter(django_filters.FilterSet):
    title = django_filters.Filter(field_name='title')

class PhotoAlbumViewSet(viewsets.ModelViewSet):
    queryset = PhotoAlbum.objects.all()
    filterset_class = AlbumFilter
    serializer_class = PhotoAlbumSerializer
    pagination_class = ResultPagination
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['title',]
    ordering_fields = ['created_at',]
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar campos de búsqueda a un método @action personalizado en un ViewSet de Django Rest Framework (DRF), puedes utilizar el atributo search_fields del decorador @action, de la siguiente manera:

    from rest_framework.decorators import action
    
    class PhotoAlbumViewSet(viewsets.ModelViewSet):
        # ...
    
        @action(detail=True, methods=['patch'], url_path='custom-action', url_name='custom_action', \
            search_fields=['title'])
        def custom_action(self, request, pk=None):
            # implementación de la acción personalizada aquí
            pass
    

    En este ejemplo, hemos añadido el atributo search_fields=['title'] al decorador @action del método custom_action(). Esto permite buscar en el campo title del modelo PhotoAlbum en el método PATCH personalizado.

    Ten en cuenta que también hemos especificado el atributo detail=True para indicar que esta acción debe implementarse de forma individual (es decir, debe aceptar un pk específico en la URL de la solicitud).

    Además, hemos especificado algunos atributos personalizados url_path y url_name para personalizar el punto final de la URL de esta acción. Estos son opcionales y pueden omitirse si no los necesitas.

    En general, deberías ser capaz de personalizar estos atributos para que se ajusten a tu caso de uso particular e incorporarlos en una acción personalizada de DRF para tu proyecto de álbumes de fotos.

Comments are closed.