Django modelo viewset método integrado de eliminación no funciona

Tengo vistas modelo que no lo anulé:

class RolesAndPermissionsViewSet(ModelViewSet):

    queryset = RoleModel.objects.all()
    serializer_class = RoleSerializer

las urls:

router = routers.DefaultRouter()

router.register(r'role', RolesAndPermissionsViewSet, basename='roles_and_permissions')

urlpatterns = [] + router.urls

serializador:

class RoleSerializer(serializers.ModelSerializer):
    permissions = RequestPermissionSerializer(many=True)

    class Meta:
        model = Role
        fields = (
            "id",
            "name",
            "permissions",
        )

    def create(self, validated_data):
        permissions = validated_data.pop('permissions', [])
        print(permissions)
        role = super(RoleSerializer, self).create(validated_data)
        for permission in permissions:
            role.permissions.add(Permission.objects.get(id=permission['id']))
        return role

y en el cartero: respuesta

pero no elimina la fila de mi django admin.

Gracias por su ayuda

Pregunta hecha hace 3 años, 4 meses, 29 días - Por debugdynamob312


3 Respuestas:

  • Sólo necesitas incluir un / al final de la URL en el cartero.

    Así que en lugar de http://127.0.0.1:8000/account/role/3,

    Deberías hacerlo. http://127.0.0.1:8000/account/role/3`/`.

    Si no desea utilizar Postman, también puede utilizar la API Browsable integrada de djangorest-framework como se muestra a continuación.

    Simplemente ingrese el elemento específico en la URL como este: http://127.0.0.1:8000/account/role/3/ y presionar el botón eliminar para eliminar un solo registro con pk=3. enter image description here

    Respondida el Dec 17, 2020 a las 07:55 - por coderchampion

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con la eliminación de filas en Django Admin probablemente esté relacionado con la forma en que se está manejando la eliminación en tu vista y serializador.

    En tu código, no veo que hayas anulado el método destroy en tu vista. El método destroy es el que se encarga de manejar la eliminación de un objeto en un ModelViewSet. Te recomendaría que anules este método en tu vista RolesAndPermissionsViewSet de la siguiente manera:

    python
    from rest_framework import status
    from rest_framework.response import Response
    
    class RolesAndPermissionsViewSet(ModelViewSet):
    
        queryset = RoleModel.objects.all()
        serializer_class = RoleSerializer
    
        def destroy(self, request, args, *kwargs):
            instance = self.get_object()
            self.perform_destroy(instance)
            return Response(status=status.HTTP_204_NO_CONTENT)
    

    Además, podrías necesitar actualizar tu serializador RoleSerializer para manejar la eliminación de permisos cuando se elimina un rol:

    python
    class RoleSerializer(serializers.ModelSerializer):
        permissions = RequestPermissionSerializer(many=True)
    
        class Meta:
            model = Role
            fields = (
                "id",
                "name",
                "permissions",
            )
    
        def create(self, validated_data):
            permissions_data = validated_data.pop('permissions', [])
            role = super(RoleSerializer, self).create(validated_data)
            self._process_permissions(role, permissions_data)
            return role
    
        def update(self, instance, validated_data):
            permissions_data = validated_data.pop('permissions', [])
            role = super(RoleSerializer, self).update(instance, validated_data)
            self._process_permissions(role, permissions_data)
            return role
    
        def _process_permissions(self, role, permissions_data):
            role.permissions.clear()
            for permission_data in permissions_data:
                role.permissions.add(Permission.objects.get(id=permission_data['id']))
    

    Con estas modificaciones, el método destroy en la vista se encargará de eliminar un objeto RoleModel de la base de datos cuando se envíe una solicitud DELETE a la API.

    Espero que estas sugerencias te ayuden a solucionar el problema con la eliminación de filas en Django Admin. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 07:56 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que no has anulado el método destroy en tu ModelViewSet. Por defecto, Django espera que el método destroy elimine el objeto asociado con la solicitud, pero en tu caso, necesitas eliminar las filas relacionadas de la tabla permissions.

    Para solucionar esto, puedes anular el método destroy en tu ModelViewSet de la siguiente manera:

    python
    class RolesAndPermissionsViewSet(ModelViewSet):
    
        queryset = RoleModel.objects.all()
        serializer_class = RoleSerializer
    
        def destroy(self, request, args, *kwargs):
            instance = self.get_object()
            instance.permissions.clear()
            instance.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
    

    Este código eliminará todas las filas relacionadas de la tabla permissions antes de eliminar el objeto RoleModel.

    Ten en cuenta que también debes importar status del módulo django.http para que funcione el código.

    Respondida el Dec 18, 2020 a las 08:07 - por Gemini

    Votos positivos: 0 | Votos negativos: 0