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.

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!

Tags:  , , , ,

Answer

  1. Avatar for 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:

    class CarSerializer(ModelSerializer):
        manufacturer_name = SerializerMethodField()
    
        class Meta:
            model = Car
            exclude = [
                'date_created',
            ]
    
        def get_manufacturer_name(self, obj):
            return obj.manufacturer.name
    

    En el serializador modificado anteriormente, agregamos un nuevo campo manufacturer_name que es un SerializerMethodField. Este campo llamará al método get_manufacturer_name() para recuperar el nombre del fabricante.

    En el método get_manufacturer_name(), pasamos el objeto Car obj como argumento, que podemos utilizar para recuperar el nombre del fabricante a través de obj.manufacturer.name.

    Luego, en tu vista, puedes pasar el CarSerializer con el serializador anidado para recuperar los datos relacionados:

    @api_view(['GET'])
    def api_list_car(request):
        qs = Car.objects.all()
        serializer = CarSerializer(qs, many=True)
        return Response(serializer.data)
    

    Después de realizar este cambio, los datos de respuesta incluirán el nombre del fabricante:

    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'}
    

Comments are closed.