TransWikia.com

Error con el campo manytomany Django

Stack Overflow en español Asked by Nicolas Rivera on December 25, 2020

Estoy trabajando con django 3.1 y con python 3.8.5

en el models.py tengo creada la siguiente clase "Publicacion"

class Publicacion(models.Model):
    codigo = models.AutoField(primary_key = True)
    usuario = models.ForeignKey(User, on_delete = models.CASCADE)
    contenido = models.TextField(null=True, blank=True)
    comentarios = models.ManyToManyField(Comentario, blank = True)
    fecha = models.DateField(auto_now_add=True)
    reportes = models.ManyToManyField(User, blank = True, related_name='reportes')
    favorito = models.ManyToManyField(User, blank = True, related_name='favorito')
    republicacion = models.ManyToManyField('self', blank=True, symmetrical=False)

    def path_img_publicacion(self, filename):
        return f'cuentas/{self.usuario.username}/imagenes/publicaciones/{filename}'

    imagen = models.ImageField(upload_to = path_img_publicacion, null = True, blank = True)

mientras que el metodo en donde estoy ocupando esta clase es el siguiente:

class RepublicarAPI(APIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def post(self, request, codigo):
        try:
            usuario = User.objects.get(username = request.user)
            publicacion = Publicacion.objects.get(codigo = codigo)
        
            contenido = request.data['contenido']
            fecha = request.data['fecha']
            imagen = imagen=request.data['imagen']
            publicaciones = publicacion.republicacion.all()

            republicacion = Publicacion(usuario=usuario)
            republicacion.contenido = contenido
            republicacion.fecha = fecha
            republicacion.imagen = imagen
            
            for publicacion in publicaciones:
                republicacion.republicacion.add(publicacion) #aca me salta al except
        
            republicacion.save()
        
            serializer = PublicacionSerializer(republicacion)

            return Response(serializer.data, status=201)
        except:
            return Response(status = 400)

el error se produce cuando intento de agregar una publicacion al campo republicaciones

One Answer

Debe usar el _set.all() para los Many-to-Many

quedando como:

class RepublicarAPI(APIView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)

def post(self, request, codigo):
    try:
        usuario = User.objects.get(username = request.user)
        publicacion = Publicacion.objects.get(codigo = codigo)
    
        contenido = request.data['contenido']
        fecha = request.data['fecha']
        imagen = imagen=request.data['imagen']
        publicaciones = publicacion.republicacion_set.all()

        republicacion = Publicacion(usuario=usuario)
        republicacion.contenido = contenido
        republicacion.fecha = fecha
        republicacion.imagen = imagen
        republicacion.save() # debe estar ya saved antes de agregarle M2M relations

        
        for publicacion in publicaciones:
            republicacion.republicacion_set.add(publicacion) #aca me salta al except
    
        # republicacion.save() # no es necesario aqui
    
        serializer = PublicacionSerializer(republicacion)

        return Response(serializer.data, status=201)
    except:
        return Response(status = 400)

Answered by WillyGuevara on December 25, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP