DjangoRestFramework y Javascript: Obtener datos adicionales
Me gustaría preguntar, ¿es posible crear una respuesta con datos relacionados de un segundo modelo? Por ejemplo:
class Manufacturer(models.Model):
name = models.CharField(max_length=100, null=False, blank=False, unique=True)
date_created = models.DateTimeField(auto_now_add=True)
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer, null=False, blank=False, on_delete=models.CASCADE)
name = models.CharField(max_length=100, null=False, blank=False)
date_created = models.DateTimeField(auto_now_add=True)
class ManufacturerSerializer(ModelSerializer):
class Meta:
model = Manufacturer
exclude = [
'date_created',
]
class CarSerializer(ModelSerializer):
class Meta:
model = Car
exclude = [
'date_created',
]
@api_view(['GET'])
def api_list_manufacturer(request):
qs = Manufacturer.objects.all()
serializer = ManufacturerSerializer(qs, many=True)
return Response(serializer.data)
@api_view(['GET'])
def api_list_car(request):
qs = Car.objects.all()
serializer = CarSerializer(qs, many=True)
return Response(serialize.data)
Actualmente estoy utilizando el método fetch para recibir los datos para el Car
…
fetch(url)
.then(response => response.json)
.then(function(data) {
console.log(data);
});
…y los datos se ven así:
0: {id: 1, name: 'Focus', manufacturer: 1},
1: {id: 2, name: 'F-150', manufacturer: 1},
2: {id: 3, name: 'Model S', manufacturer: 2}
Mi pregunta es: ¿Es posible obtener, por ejemplo, el name
del manufacturer
en mi respuesta? ¿Algo así?
0: {id: 1, name: 'Focus', manufacturer: 1, manufacturer__name: 'Ford'},
1: {id: 2, name: 'F-150', manufacturer: 1, manufacturer__name: 'Ford'},
2: {id: 3, name: 'Model S', manufacturer: 2, manufacturer__name: 'Tesla'}
¡Gracias por toda tu ayuda y que tengas un excelente domingo!
davy.ai
Sí, es posible obtener el nombre del fabricante en la respuesta utilizando serializadores anidados. Así es como puedes modificar tu
CarSerializer
para incluir el nombre del fabricante:En el serializador modificado anteriormente, agregamos un nuevo campo
manufacturer_name
que es unSerializerMethodField
. Este campo llamará al métodoget_manufacturer_name()
para recuperar el nombre del fabricante.En el método
get_manufacturer_name()
, pasamos el objetoCar
obj
como argumento, que podemos utilizar para recuperar el nombre del fabricante a través deobj.manufacturer.name
.Luego, en tu vista, puedes pasar el
CarSerializer
con el serializador anidado para recuperar los datos relacionados:Después de realizar este cambio, los datos de respuesta incluirán el nombre del fabricante: