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’
davy.ai
El error parece ser causado por la línea
portfo = Portfolio.objects.get(id=id)
en el métodoput
de la clasePortfolioUpdateView
. Parece queid
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étodoput
al hacer una solicitud. Puedes hacer esto agregandoid
como parámetro al método de esta manera:Luego, al hacer una solicitud PUT a la vista, debes incluir el ID del portfolio que deseas actualizar en la URL, de esta manera:
Aquí,
1
es el ID del portfolio que deseas actualizar. Esto permitirá que el métodoput
recupere el objeto de portfolio correcto usandoid
.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 serserilize = self.serializer_class(instance=portfo, data=request.data)
, ya que deseas serializar el objetoportfo
existente, no el usuario de la solicitud. También hay problemas con la forma en que estás actualizando el objetoPortfolio
. En su lugar, deberías actualizar los campos en el objetoportfo
recuperado y guardarlo en la base de datos utilizandoportfo.save()
. Sugeriría consultar la documentación de Django REST Framework para ver ejemplos de cómo implementar vistas de actualización.