Store genres in artists as m2m field (#34)
This commit is contained in:
@@ -3,6 +3,22 @@ from django.db import models
|
|||||||
# id's are 22 in length in examples but set to 30 for buffer
|
# id's are 22 in length in examples but set to 30 for buffer
|
||||||
MAX_ID = 30
|
MAX_ID = 30
|
||||||
|
|
||||||
|
# Genre {{{ #
|
||||||
|
|
||||||
|
class Genre(models.Model):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = "Genre"
|
||||||
|
verbose_name_plural = "Genres"
|
||||||
|
|
||||||
|
name = models.CharField(primary_key=True, max_length=50)
|
||||||
|
num_songs = models.PositiveIntegerField()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
# }}} Genre #
|
||||||
|
|
||||||
# Artist {{{ #
|
# Artist {{{ #
|
||||||
|
|
||||||
|
|
||||||
@@ -14,6 +30,7 @@ class Artist(models.Model):
|
|||||||
artist_id = models.CharField(primary_key=True, max_length=MAX_ID)
|
artist_id = models.CharField(primary_key=True, max_length=MAX_ID)
|
||||||
# unique since only storing one genre per artist right now
|
# unique since only storing one genre per artist right now
|
||||||
name = models.CharField(unique=True, max_length=50)
|
name = models.CharField(unique=True, max_length=50)
|
||||||
|
genres = models.ManyToManyField(Genre, blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
@@ -35,18 +52,6 @@ class User(models.Model):
|
|||||||
|
|
||||||
# }}} User #
|
# }}} User #
|
||||||
|
|
||||||
class Genre(models.Model):
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = "Genre"
|
|
||||||
verbose_name_plural = "Genres"
|
|
||||||
|
|
||||||
name = models.CharField(primary_key=True, max_length=50)
|
|
||||||
num_songs = models.PositiveIntegerField()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.name
|
|
||||||
|
|
||||||
# Track {{{ #
|
# Track {{{ #
|
||||||
|
|
||||||
class Track(models.Model):
|
class Track(models.Model):
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ def parse_library(headers, tracks, user):
|
|||||||
name=artist_dict['name'],
|
name=artist_dict['name'],
|
||||||
)
|
)
|
||||||
if artist_created:
|
if artist_created:
|
||||||
tally_artist_genres(headers, artist_dict['id'])
|
add_artist_genres(headers, artist_obj)
|
||||||
|
|
||||||
# update_artist_genre(headers, artist_obj)
|
# update_artist_genre(headers, artist_obj)
|
||||||
# get_or_create() returns a tuple (obj, created)
|
# get_or_create() returns a tuple (obj, created)
|
||||||
@@ -341,24 +341,26 @@ def get_top_genre(headers, top_artist_id):
|
|||||||
|
|
||||||
# }}} #
|
# }}} #
|
||||||
|
|
||||||
def tally_artist_genres(headers, artist_id):
|
def add_artist_genres(headers, artist_obj):
|
||||||
"""Tallies up genres for artist for the respective Genre models. Should be
|
"""Adds genres to artist_obj and increases the count the respective Genre
|
||||||
called when new Artist object is created.
|
object. Should be called when a new Artist object is created.
|
||||||
|
|
||||||
:headers: For making the API call.
|
:headers: For making the API call.
|
||||||
:artist_id: Artist ID for which to tally up genres for.
|
:artist_obj: Artist object for which to add/tally up genres for.
|
||||||
|
|
||||||
:returns: None
|
:returns: None
|
||||||
|
|
||||||
"""
|
"""
|
||||||
artist_response = requests.get('https://api.spotify.com/v1/artists/' +
|
artist_response = requests.get('https://api.spotify.com/v1/artists/' +
|
||||||
artist_id, headers=headers).json()
|
artist_obj.artist_id, headers=headers).json()
|
||||||
for genre in artist_response['genres']:
|
for genre in artist_response['genres']:
|
||||||
genre_obj, created = Genre.objects.get_or_create(name=genre,
|
genre_obj, created = Genre.objects.get_or_create(name=genre,
|
||||||
defaults={'num_songs':1})
|
defaults={'num_songs':1})
|
||||||
if not created:
|
if not created:
|
||||||
genre_obj.num_songs = F('num_songs') +1
|
genre_obj.num_songs = F('num_songs') +1
|
||||||
genre_obj.save()
|
genre_obj.save()
|
||||||
|
artist_obj.genres.add(genre_obj)
|
||||||
|
artist_obj.save()
|
||||||
|
|
||||||
# process_library_stats {{{ #
|
# process_library_stats {{{ #
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user