Skip to content

Commit fb54dfc

Browse files
committed
Implement AlbumSerializer in music app and update docs
Expanded the existing service of the music app by introducing the AlbumSerializer. This includes defining required fields, and creating methods for 'create' and 'update' operations. The documentation is correspondingly updated to explain the new AlbumSerializer and its methods.
1 parent eb7fa0f commit fb54dfc

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

docs/images/index.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,54 @@ Last but not least `destroy` action to delete albums
464464

465465
With `destroy` set the we finish the change on `music.views.py`
466466

467+
Now we go for our `AlbumSerializer`
468+
469+
```python
470+
class AlbumSerializer(serializers.Serializer):
471+
title = serializers.CharField()
472+
artist = ArtistSerializer() # Serializers inherits from Field, so it can be used as fields too
473+
release_year = serializers.IntegerField()
474+
475+
class Meta:
476+
fields = ['title', 'artist', 'release_year']
477+
```
478+
479+
1. First we define our `AlbumSerializer` inheriting from `serializers.Serializer`
480+
2. With the fields `title`, `artist`, `release_year` with it respective fields
481+
3. We also need to list the fields inside the class Meta
482+
483+
Additionally we need to add 2 methods to let DRF know how to save and how to update the Albums.
484+
485+
The first is `create`
486+
487+
```python
488+
def create(self, validated_data):
489+
artist_data = validated_data.pop('artist')
490+
artist, created = Artist.objects.get_or_create(name=artist_data['name'])
491+
return Album.objects.create(artist=artist, **validated_data)
492+
```
493+
1. Where we create the album but since the album has artist as a nested model we need to create it here before try to save the album itself.
494+
2. Don't forget to import the `Album` model here with `from music.models import Album`
495+
496+
and the `update` method
497+
```python
498+
def update(self, album, validated_data):
499+
artist_data = validated_data.pop('artist')
500+
artist, created = Artist.objects.get_or_create(name=artist_data['name'])
501+
502+
album.title = validated_data.get('title', album.title)
503+
album.release_year = validated_data.get('release_year', album.release_year)
504+
album.artist = artist
505+
album.save()
506+
507+
return album
508+
```
509+
1. To update we need to do the same with the `Artist` model, creating/getting it before save the Album
510+
2. So we get the new fields and save it
511+
3. Last we return the updated album
512+
513+
With everything set we can see it working live.
514+
467515
## Bonus content
468516

469517
### Serializers deep dive

first_api/music/serializers.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,37 @@
11
from rest_framework import serializers
22

3-
from music.models import Artist
3+
from music.models import Artist, Album
44

55

66
class ArtistSerializer(serializers.HyperlinkedModelSerializer):
77
class Meta:
88
model = Artist
99
fields = ['name']
10+
11+
12+
# You could use the HyperlinkedModelSerializer here but
13+
# want you to know how a plain serializer works
14+
# class AlbumSerializer(serializers.HyperlinkedModelSerializer):
15+
class AlbumSerializer(serializers.Serializer):
16+
title = serializers.CharField()
17+
artist = ArtistSerializer() # Serializers inherits from Field, so it can be used as fields too
18+
release_year = serializers.IntegerField()
19+
20+
class Meta:
21+
fields = ['title', 'artist', 'release_year']
22+
23+
def create(self, validated_data):
24+
artist_data = validated_data.pop('artist')
25+
artist, created = Artist.objects.get_or_create(name=artist_data['name'])
26+
return Album.objects.create(artist=artist, **validated_data)
27+
28+
def update(self, album, validated_data):
29+
artist_data = validated_data.pop('artist')
30+
artist, created = Artist.objects.get_or_create(name=artist_data['name'])
31+
32+
album.title = validated_data.get('title', album.title)
33+
album.release_year = validated_data.get('release_year', album.release_year)
34+
album.artist = artist
35+
album.save()
36+
37+
return album

0 commit comments

Comments
 (0)