serializers.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from furl import furl
  2. from rest_framework import serializers
  3. from rest_framework.reverse import reverse as drf_reverse
  4. from .fields import UUIDHyperlinkedIdentityField
  5. from .models import Album, Artist, Track
  6. class TrackAlbumArtistSerializer(serializers.ModelSerializer):
  7. uuid = serializers.ReadOnlyField()
  8. url = UUIDHyperlinkedIdentityField(view_name="artist-detail")
  9. class Meta:
  10. model = Artist
  11. fields = ("uuid", "url", "name")
  12. class TrackAlbumSerializer(serializers.ModelSerializer):
  13. uuid = serializers.ReadOnlyField()
  14. url = UUIDHyperlinkedIdentityField(view_name="album-detail")
  15. artist = TrackAlbumArtistSerializer()
  16. class Meta:
  17. model = Album
  18. fields = ("uuid", "url", "name", "artist")
  19. class TrackSerializer(serializers.ModelSerializer):
  20. uuid = serializers.ReadOnlyField()
  21. url = UUIDHyperlinkedIdentityField(view_name="track-detail")
  22. album = TrackAlbumSerializer()
  23. class Meta:
  24. model = Track
  25. fields = ("uuid", "url", "name", "number", "album")
  26. class AlbumTrackSerializer(TrackSerializer):
  27. uuid = serializers.ReadOnlyField()
  28. url = UUIDHyperlinkedIdentityField(view_name="track-detail")
  29. class Meta:
  30. model = Track
  31. fields = ("uuid", "url", "name", "number")
  32. class AlbumArtistSerializer(serializers.ModelSerializer):
  33. uuid = serializers.ReadOnlyField()
  34. url = UUIDHyperlinkedIdentityField(view_name="artist-detail")
  35. class Meta:
  36. model = Artist
  37. fields = ("uuid", "url", "name")
  38. class AlbumSerializer(serializers.ModelSerializer):
  39. uuid = serializers.ReadOnlyField()
  40. url = UUIDHyperlinkedIdentityField(view_name="album-detail")
  41. artist = AlbumArtistSerializer()
  42. tracks = AlbumTrackSerializer(many=True)
  43. class Meta:
  44. model = Album
  45. fields = ("uuid", "url", "name", "year", "artist", "tracks")
  46. class ArtistSerializer(serializers.ModelSerializer):
  47. uuid = serializers.ReadOnlyField()
  48. url = UUIDHyperlinkedIdentityField(view_name="artist-detail")
  49. albums_url = serializers.SerializerMethodField()
  50. class Meta:
  51. model = Artist
  52. fields = ("uuid", "url", "name", "albums_url")
  53. def get_albums_url(self, artist):
  54. path = drf_reverse("album-list", request=self.context["request"])
  55. return furl(path).set({"artist_uuid": artist.uuid}).url