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
.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étododestroy
es el que se encarga de manejar la eliminación de un objeto en unModelViewSet
. Te recomendaría que anules este método en tu vistaRolesAndPermissionsViewSet
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 objetoRoleModel
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 tuModelViewSet
. Por defecto, Django espera que el métododestroy
elimine el objeto asociado con la solicitud, pero en tu caso, necesitas eliminar las filas relacionadas de la tablapermissions
.Para solucionar esto, puedes anular el método
destroy
en tuModelViewSet
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 objetoRoleModel
.Ten en cuenta que también debes importar
status
del módulodjango.http
para que funcione el código.Respondida el Dec 18, 2020 a las 08:07 - por Gemini
Votos positivos: 0 | Votos negativos: 0