Me gustaría preguntar si es posible crear una respuesta con datos relacionados de un segundo modelo. Por ejemplo:
modelos.py
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)serializadores.py
class ManufacturerSerializer(ModelSerializer): class Meta: model = Manufacturer exclude = [ 'date_created', ] class CarSerializer(ModelSerializer): class Meta: model = Car exclude = [ 'date_created', ]vistas.py
@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_card(request): qs = Car.objects.all() serializer = CarSerializer(qs, many=True) return Response(serializer.data)Ahora sé que estoy usando el método fetch para recibir los datos del automóvil ...
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 posible obtener, por ejemplo, el nombre del fabricante en mi respuesta? ¿Algo como esto?
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 su ayuda y que tengan un excelente domingo!
Utilice SerializerMethodField . Este es un campo de sólo lectura. Obtiene su valor llamando a un método en la clase de serializador a la que está adjunto. Se puede usar para agregar cualquier tipo de datos a la representación serializada de su objeto
Dentro de serializers.py agregue:
from rest_framework.serializers import SerializerMethodField class CarSerializer(ModelSerializer): manufacturer__name = SerializerMethodField(help_text="Name of the Car Manufacturer") class Meta: model = Car fields = [ 'id', 'name', 'manufacturer', 'manufacturer__name', ] def get_manufacturer__name(self, instance: Car): return instance.manufacturer.nameOK,
así que encontré la solución! Dentro de mi serializers.py cambié el del auto por este:
class CarSerializer(ModelSerializer): manufacturer_name = CharField(source='manufacturer.name') class Meta: model = Car exclude = [ 'date_created', ]