Is there a way to order a nested serializer _set
, for example order by pk
or time-stamp
.
So basically order song_set
shown in the json data below from the most recent to the latest object created, in this case by order_by('-timestamp')
or order_by('-pk')
.
Json data
{ "pk": 151, "album_name": "Name", "song_set": [ { pk: 3, timestamp: '5 seconds' }, { pk: 2, timestamp: '10 seconds' }, { pk: 1, timestamp: '15 seconds' } ] }
Model
class Album(models.Model): album_name = models.CharField(max_length=100, blank=True) class Song(models.Model): album = models.ForeignKey('album.Album', default=1) timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
Serializer
class SongListSerializer(HyperlinkedModelSerializer): class Meta: model = Song fields = [ 'pk', 'timestamp' ] class AlbumSerializer(HyperlinkedModelSerializer): song_set = SongListSerializer(many=True, read_only=True) class Meta: model = Album fields = [ 'pk', 'timestamp', 'song_set' ]
You can use SerializerMethodField
and write custom method for this.
class AlbumSerializer(HyperlinkedModelSerializer): song_set = serializers.SerializerMethodField() class Meta: model = Album fields = [ 'pk', 'timestamp', 'song_set' ] def get_song_set(self, instance): songs = instance.song_set.all().order_by('-timestamp') return SongListSerializer(songs, many=True).data
Add ordering meta parameter to your Song model:
class Song(models.Model): album = models.ForeignKey('album.Album', default=1) timestamp = models.DateTimeField(auto_now_add=True, auto_now=False) class Meta: ordering = ['timestamp', 'pk']
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With