models.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from uuid import uuid4
  2. from django.db import models
  3. from django.urls import reverse
  4. from django.utils.translation import gettext as _
  5. class UUIDManager(models.Manager):
  6. def get_by_natural_key(self, uuid):
  7. return self.get(uuid=uuid)
  8. class UUIDModel(models.Model):
  9. uuid = models.UUIDField(verbose_name="UUID", default=uuid4, unique=True)
  10. objects = UUIDManager()
  11. class Meta:
  12. abstract = True
  13. def natural_key(self):
  14. return (self.uuid,)
  15. class Artist(UUIDModel):
  16. name = models.CharField(max_length=100, help_text=_("The artist name"))
  17. class Meta:
  18. ordering = ("name",)
  19. indexes = (models.Index(fields=("name",)),)
  20. def __str__(self):
  21. return self.name
  22. def get_absolute_url(self):
  23. return reverse("admin:grunge_artist_change", kwargs={"object_id": self.pk})
  24. class Album(UUIDModel):
  25. name = models.CharField(max_length=100, help_text=_("The album name"))
  26. year = models.PositiveSmallIntegerField(
  27. help_text=_("The year the album was released")
  28. )
  29. artist = models.ForeignKey(
  30. Artist,
  31. help_text=_("The artist that produced the album"),
  32. related_name="albums",
  33. on_delete=models.CASCADE,
  34. )
  35. class Meta:
  36. ordering = ("artist", "year", "name")
  37. indexes = (models.Index(fields=("artist", "year", "name")),)
  38. def __str__(self):
  39. return self.name
  40. def get_absolute_url(self):
  41. return reverse("admin:grunge_album_change", kwargs={"object_id": self.pk})
  42. class Track(UUIDModel):
  43. name = models.CharField(max_length=100, help_text=_("The track name"))
  44. album = models.ForeignKey(
  45. Album,
  46. help_text=_("The album this track appears on"),
  47. related_name="tracks",
  48. on_delete=models.CASCADE,
  49. )
  50. number = models.PositiveSmallIntegerField(
  51. help_text=_("The track number on the album")
  52. )
  53. class Meta:
  54. ordering = ("number", "name")
  55. indexes = (models.Index(fields=("number", "name")),)
  56. constraints = (
  57. models.UniqueConstraint(
  58. fields=("album", "number"), name="unique_album_number"
  59. ),
  60. )
  61. def __str__(self):
  62. return self.name
  63. def get_absolute_url(self):
  64. return reverse("admin:grunge_track_change", kwargs={"object_id": self.pk})