Django Rest Framework: Llaves foráneas y serializadores anidados

Escrito el sábado, 09 de mayo del 2020.

Con Django Rest Framework, es relativamente rapido crear apis y levantar servicios para realizar operaciones CRUD (Create, Read, Update y Delete).

Para hacer el guardado de objectos existentes, me puse a la tarea de investigar la posibilidad de que el servicio reciba una llave foránea en la peticion POST, y que al hacer GET me devuelva el objeto relacionado pero con sus campos completos (el comportamiento por defecto corresponde a devolver solo la llave primaria).

Entonces teniendo los siguientes modelos:

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)


class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

Y con sus correspondientes Serializers, sobreescribimos el metodo to_representation:

class AlbumSerializer(ModelSerializer):
    class Meta:
        model = Album
        fields = '__all__'


class TrackSerializer(ModelSerializer):
    class Meta:
        model = Track
        fields = '__all__'

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['album'] = AlbumSerializer(instance.album).data
        return response

El cual nos devolverá una instancia album con todos sus campos en el objeto json.

Referencias:

Stackoverflow

Esta entrada fue etiquetada en #Django y #DRF

 

Social

Etiquetas