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.

Actualizar vista DRF con campo de muchos a muchos.

Estoy intentando escribir una vista de actualización, pero obtengo un error. Por favor, ayúdame a encontrar el problema, ¡gracias 🙂
Al principio tengo un campo de muchos a muchos en mi modelo. Este es mi modelo:

class Portfolio(models.Model):
    name = models.CharField(max_length=50, unique=True, blank=False, null=True)
    market = models.ForeignKey(Market, on_delete=models.DO_NOTHING, related_name='market')
    investor = models.ForeignKey('accounts.User', on_delete=models.DO_NOTHING, related_name='investor')
    assets = models.ManyToManyField(Assets, related_name='assets')

def __str__(self):
    return self.name

Después de eso tengo un serializador para mi vista:

class PortfolioSerializer(serializers.ModelSerializer):
    class Meta:
        model = Portfolio
        fields = ['name', 'market', 'investor', 'assets']

Esta es mi vista:

class PortfolioUpdateView(APIView):
    serializer_class = PortfolioSerializer

    def put(self, request, *args,):
        data = request.data
        portfo = Portfolio.objects.get(id=id)
        print(portfo)

        serilize = self.serializer_class(instance=request.user, data=request.POST)

        if serilize.is_valid():
            name = serilize.data['name']
            market = Market.objects.get(pk=int(request.POST.get('market', '')))
            assets = Assets.objects.get(pk=int(request.POST.get('assets', '')))

            Portfolio.objects.update(name=name, market=market, assets=assets)

            return portfo
        else:
            pass

Y finalmente este es mi error:

TypeError at /market/update/1
put() recibió un argumento inesperado ‘id’

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error parece ser causado por la línea portfo = Portfolio.objects.get(id=id) en el método put de la clase PortfolioUpdateView. Parece que id no está definido en ningún lugar del método, por lo tanto, se produce el error de argumento de palabra clave inesperado.

    Para solucionar este error, necesitas definir id y pasarlo como parámetro al método put al hacer una solicitud. Puedes hacer esto agregando id como parámetro al método de esta manera:

    def put(self, request, id, *args,):
    

    Luego, al hacer una solicitud PUT a la vista, debes incluir el ID del portfolio que deseas actualizar en la URL, de esta manera:

    /market/update/1/
    

    Aquí, 1 es el ID del portfolio que deseas actualizar. Esto permitirá que el método put recupere el objeto de portfolio correcto usando id.

    También vale la pena señalar que hay algunos problemas con la implementación del método put. Por ejemplo, serilize = self.serializer_class(instance=request.user, data=request.POST) debería ser serilize = self.serializer_class(instance=portfo, data=request.data), ya que deseas serializar el objeto portfo existente, no el usuario de la solicitud. También hay problemas con la forma en que estás actualizando el objeto Portfolio. En su lugar, deberías actualizar los campos en el objeto portfo recuperado y guardarlo en la base de datos utilizando portfo.save(). Sugeriría consultar la documentación de Django REST Framework para ver ejemplos de cómo implementar vistas de actualización.

Comments are closed.